没有得到正确的结果

时间:2016-07-28 02:25:43

标签: javascript arrays loops object

我一直试图删除对象的键和对象数组,如果它们不相同,则返回一个带对象的新数组。

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}];

1 个答案:

答案 0 :(得分:0)

由于i !== 0,你的if语句不会处理第一个元素,而且它只会将其他元素与第一个元素进行比较,而不是相互比较(但你没有看到,因为它恰好发生了对于您的示例输入,第二个和第三个对象没有任何不在第一个对象中的公共密钥。在.push()之后应该tempObj for..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));属性),那么您希望结果中包含这些属性。另请注意,我已经更改了它,因此函数返回结果而不是记录它们(然后是日志函数的返回)。

或者这是用更多功能方法实现的等效逻辑 - 注意函数的缩短程度:

axis.scale().ticks()