JavaScript数组对象中值的累加

3

我有一个对象数组,形如:const array=[{a:1, b:1} , {a:2, b:3} ,{a:1, b:1}]

我希望得到一个结果数组 results = [{a:4 , b:5}],其中的值是按照键从对象数组中所有值的总和。

我尝试了以下方法,但有时它会跳过数组中的第一个对象:

       array.reduce((acc, n) => {
          for (var prop in n) {
            if (acc.hasOwnProperty(prop)) acc[prop] += n[prop];
            else acc[prop] = 0;
          }
          return acc;
        }, {})
4个回答

3

在赋值之前,您需要初始化acc,因此下面的小修改将起作用。

 const array=[{a:1, b:1} , {a:2, b:3} ,{a:1, b:1}]
 const res = array.reduce((acc, n) => {
          for (var prop in n) {
          acc[prop] = acc[prop] || 0; // Need to initialize before assigning
            if (n.hasOwnProperty(prop)) {
                 acc[prop] += n[prop];
               } 
          }
          return acc;
        }, {})
console.log(res);


3

这将会起作用。

const res = [{a:1, b:1, c: 1} , {a:2, b:3, c:3} ,{a:1, b:1, c: 3}].reduce((a,v,i) => {
    for(let key in v) {
      a[key] = a[key] ? a[key] + v[key] : v[key];
    }
    return a
},{})

console.log(res)


1
静态指定对象属性似乎不是最好的解决方案,因为我认为他的示例对象(obj.a、obj.b等)可能只是他在生产中处理的简化版本。 - Brian Patterson
1
是的,同意...谢谢您宝贵的评论。我已经更新答案。 - gdh

2
你可以使用这段代码,无需手动指定对象属性,它会在属性不存在时创建一个新属性,在属性存在时添加到现有属性中。

var myarr = [{a: 2, b: 3}, {a:3, b:2}];
var newobj = {};

for (var i=0; i <= myarr.length; i += 1)   
  for (var p in myarr[i]) newobj[p] = (p in newobj) ? 
    newobj[p] + myarr[i][p] : myarr[i][p]
    
console.log(newobj);


0

使用 forEachObject.entries 可以简化代码。

const array = [
  { a: 1, b: 1 },
  { a: 2, b: 3 },
  { a: 1, b: 1 },
];

const acc = (arr) => {
  const res = {};
  arr.forEach((obj) =>
    Object.entries(obj).forEach(
      ([key, value]) => (res[key] = key in res ? res[key] + value : value)
    )
  );
  return [res];
};

console.log(acc(array));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接