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

Javascript 在对象数组中添加匹配键的值,javascript,arrays,object,Javascript,Arrays,Object,我有一个数组,其中包含许多具有匹配键的对象: [{a: 2, b: 5, c: 6}, {a:3, b: 4, d:1},{a: 1, d: 2}] 我想在数组中循环,如果键匹配,我想添加每个键的结果,并返回一个包含每个键总和的对象 i、 e 我目前拥有的代码是 function combine() { var answer = []; for(var i in arguments){ answer.push(arguments[i]) } answer.reduce

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

[{a: 2, b: 5, c: 6}, {a:3, b: 4, d:1},{a: 1, d: 2}]
我想在数组中循环,如果键匹配,我想添加每个键的结果,并返回一个包含每个键总和的对象

i、 e

我目前拥有的代码是

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;
    }, {});
}
如果使用下划线库,我可以找到答案,但是我希望不使用库。我想我很难理解
reduce
方法是如何工作的-

对于如何解决这一问题,我们将不胜感激。另外,我觉得这是一个答案,应该在某处,所以不必使用图书馆


提前感谢。

循环浏览每个对象并添加它

vara=[{a:2,b:5,c:6},{a:3,b:4,d:1},{a:1,d:2}];
var ans={};
对于(变量i=0;i试试这个

resobj={};
[{a:2,b:5,c:6},{a:3,b:4,d:1},{a:1,d:2}].forEach(函数(v){
var keys=Object.keys(v);
对于(i=0;i
中的回调函数需要两个参数:

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

    var输入=[
    {a:2,b:5,c:6},
    {a:3,b:4,d:1},
    {a:1,d:2}
    ];
    var应答=输入。减少(功能(上一个,当前){
    用于(以货币表示的var p){
    上一个[p]=(上一个[p]| | 0)+当前[p];
    }
    return prev;//这将在下一次迭代中作为prev传递或作为结果返回。
    }, {}); // {}是作为prev传递的初始值
    
    控制台日志(应答)使用reduce的另一个解决方案:

    var result=[{a:2,b:5,c:6},{a:3,b:4,d:1},{a:1,d:2}].reduce(函数(上一个,当前){
    Object.keys(当前).forEach(函数(键){
    上一[键]=(上一[键]| | 0)+当前[键];
    });
    返回上一个;
    }, {});
    document.write(“”+JSON.stringify(结果,0,2)+“”)只需使用和一个对象即可获得结果

    var data=[{a:2,b:5,c:6},{a:3,b:4,d:1},{a:1,d:2}],
    obj={};
    data.forEach(函数(o){
    Object.keys(o).forEach(函数(k){
    obj[k]=(obj[k]| | 0)+o[k];
    });
    })
    document.write(''+JSON.stringify(obj,0,4)+'')
    
    还要提到您得到的rn输出。谢谢,这很有效。然而,我对这一行有点困惑
    ans[obj]=ans[obj]?ans[obj]+a[i][obj]:a[i][obj]。你能在回答中解释一下吗?
    
    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;
        }, {});
    }
    
    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));