在对象数组中添加匹配键的值

时间:2016-03-01 10:52:59

标签: javascript arrays object

我有一个包含许多具有匹配键的对象的数组:

[{a: 2, b: 5, c: 6}, {a:3, b: 4, d:1},{a: 1, d: 2}]

我想遍历数组,如果键匹配,我想添加每个键的结果,并返回一个具有每个键之和的对象。

即。

{a: 6, b: 9, c: 6, d: 3}

我目前的代码是

function combine() {
   var answer = [];
  for(var i in arguments){
    answer.push(arguments[i])
  }

 answer.reduce(function(o) {
    for (var p in o)
        answer[p] = (p in answer ? answer[p] : 0) + o[p];
        return answer;
    }, {});
}

如果我要使用下划线库,我可以找到答案here但是我希望在不使用库的情况下这样做。我想我很难理解reduce方法的工作原理 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

如何解决这个问题的任何帮助将不胜感激。此外,我觉得这是一个应该在某处的答案,而不必使用库。

提前致谢。

6 个答案:

答案 0 :(得分:2)

使用Array.reduce()和Array.map()

var tab = [{a: 2, b: 5, c: 6}, {a:3, b: 4, d:1},{a: 1, d: 2}];

function sum(tab) {
  return tab.reduce((a, b) => {
    Object.keys(b).map(c => a[c] = (a[c] || 0) + b[c]);
    return a;
  });
}

console.log(sum(tab));

答案 1 :(得分:1)

遍历每个对象并添加它。

    var a = [{a: 2, b: 5, c: 6}, {a:3, b: 4, d:1},{a: 1, d: 2}];
    var ans = {};

    for(var i = 0; i < a.length; ++i){
      for(var obj in a[i]){
       ans[obj] = ans[obj] ? ans[obj] + a[i][obj] : a[i][obj];
      }
    }
document.write(JSON.stringify(ans));

ans[obj] = ans[obj] ? ans[obj] + a[i][obj] : a[i][obj];

This line is the same as    
// check if the object already exists(or not falsy) in answer, if Yes add that value to the new value
if(ans[obj])
{
  ans[obj] = ans[obj] + a[i][obj];
}
// else create a new object in the answer and set it to the value from the array
else
{
  ans[obj] = a[i][obj];
}

答案 2 :(得分:1)

试试这个

resobj = {};
[{a: 2,b: 5,c: 6}, {a: 3,b: 4,d: 1}, {a: 1,d: 2}].forEach(function(v) {

  var keys = Object.keys(v);
  for (i = 0; i < keys.length; i++) {
    if (typeof resobj[keys[i]] == 'undefined') {
      resobj[keys[i]] = Number(v[keys[i]]);
    } else {
      resobj[keys[i]] += v[keys[i]];
    }
  }

})

document.write(JSON.stringify(resobj))

答案 3 :(得分:1)

reduce()中的回调函数需要两个参数:

  1. 返回上一个值的结果(如果是第一个值,则返回初始值)
  2. 循环中的当前值
  3. 您还应该传递一个空对象作为第二个参数来减少。这是你要填写的那个。

    &#13;
    &#13;
    var input = [
      {a: 2, b: 5, c: 6},
      {a: 3, b: 4, d: 1},
      {a: 1, d: 2}
    ];
    
    var answer = input.reduce(function(prev, curr) {
        for (var p in curr) {
            prev[p] = (prev[p] || 0) + curr[p];
        }
    
        return prev; // this will be passed as prev in the next iteration or returned as the result.
    }, {}); // The {} is the initial value passed as prev
    
    console.log(answer);
    &#13;
    &#13;
    &#13;

答案 4 :(得分:0)

还原的另一种解决方案:

var result = [{a: 2, b: 5, c: 6}, {a:3, b: 4, d:1},{a: 1, d: 2}].reduce(function(prev, current) {
    Object.keys(current).forEach(function(key) {
        prev[key] = (prev[key] || 0) + current[key]; 
    });
    return prev;
}, {});

document.write('<pre>' + JSON.stringify(result, 0, 2) + '</pre>');

答案 5 :(得分:0)

只需使用Array#forEach()和结果对象。

var data = [{ a: 2, b: 5, c: 6 }, { a: 3, b: 4, d: 1 }, { a: 1, d: 2 }],
    obj = {};

data.forEach(function (o) {
    Object.keys(o).forEach(function (k) {
        obj[k] = (obj[k] || 0) + o[k];
    });
})
document.write('<pre>' + JSON.stringify(obj, 0, 4) + '</pre>');