没有得到正确的结果

问题描述:

我一直在试图删除键和对象数组,如果它不相同,并返回一个新的数组与对象。没有得到正确的结果

var all = [{banana: 1, rose: 2, mouse: 9, apple: 5}, {banana: 1, rock: 58, car: 19, apple: 5}, {banana: 1, red: 14, clue: 89, apple: 5}]; 

function differentKeys(arr){ 
    var different_keys = []; 
    for (var i = 0; i < arr.length; i++) { 
    var tempObj = {}; 
    for (var key in arr[i]) {  
     if (!arr[i][key] || arr[i][key] != arr[0][key] && i !== 0) { 
     tempObj[key] = arr[i][key]; 
     different_keys.push(tempObj); 
    } 
    } 
    } 
    console.log(different_keys); 
} 

differentKeys(all); 

结果期待是:

different_keys = [{rose: 2, mouse: 9}, {rock: 58, car: 19}, {red: 14, clue: 89}]; 

获取:

different_keys = [{rock: 58, car: 19}, {red: 14, clue: 89}]; 
+0

应该'arr.push(TEMPOBJ);'实际上是'different_keys .push(TEMPOBJ);'?目前你正在迭代中添加额外的项目到源数组中,所以这肯定会导致无限循环... – nnnnnn

+0

@nnnnnn谢谢你,就是这样。但我没有得到: 'different_keys = [{rose:2,mouse:9},{rock:58,car:19},{red:14,clue:89}];' Im getting: ' different_keys = [{rock:58,car:19},{red:14,clue:89}];' 为什么? –

你的if语句不处理,因为i !== 0的第一要素,再加上它只是对其他元素进行比较第一个,不是彼此对立的(但是你没有看到,因为它发生在你的样本输入中,第二个和第三个对象没有任何公共密钥是不在第一个对象中)。并且它内tempObjfor..in当它应该这样做后for..in

您需要嵌套三个循环:像当前代码一样迭代输入对象的最外层循环,根据当前代码循环访问当前对象的属性的中间循环,然后将内循环检查所有其他对象以查看它们是否具有该属性。

所以也许有点像下面这样。

var all = [{banana: 1, rose: 2, mouse: 9, apple: 5}, {banana: 1, rock: 58, car: 19, apple: 5, cheese: 3}, {banana: 1, cheese: 2, red: 14, clue: 89, apple: 5}]; 
 

 
function differentKeys(arr) { 
 
    var result = []; 
 
    for (var i = 0; i < arr.length; i++) { // process all elements 
 
    var tempObj = {}; 
 
    for (var key in arr[i]) { // process keys in current element 
 
     var found = false; 
 
     for (var j = 0; j < arr.length; j++) { // compare against other elements 
 
     if (i !== j && arr[j][key] === arr[i][key]) { 
 
      found = true; 
 
      break; 
 
     } 
 
     } 
 
     if (!found) { 
 
     tempObj[key] = arr[i][key]; 
 
     } 
 
    } 
 
    result.push(tempObj); 
 
    } 
 
    return result; 
 
} 
 
console.log(differentKeys(all));

注:以上假定,如果两个物体具有相同名称的属性,但(像我加入到第二和第三对象cheese属性)不同的值,你希望这些包括在结果中。还要注意,我已经改变了它,所以函数返回的结果而不是记录它们(然后我的日志函数的返回)。

或者这里是一个功能更强大的方式来实现等价逻辑 - 注意函数多少短是:

var all = [{banana: 1, rose: 2, mouse: 9, apple: 5}, {banana: 1, rock: 58, car: 19, apple: 5, cheese: 3}, {banana: 1, cheese: 2, red: 14, clue: 89, apple: 5}]; 
 

 
function differentKeys(arr) { 
 
    return arr.map(function(v, i) { 
 
    return Object.keys(v).reduce(function(a, c) { 
 
     if (!arr.some(function(o, j) { return i != j && v[c] === o[c]; })) 
 
     a[c] = v[c]; 
 
     return a; 
 
    }, {}); 
 
    }); 
 
} 
 
console.log(differentKeys(all));