Sum属性数组对象

时间:2018-06-19 10:44:48

标签: javascript arrays

我有一个对象数组,例如:

 [{
      name: 'mike',
      id: 3312,
      points: 2,
      summary: 'example',
  }, {
      name: 'andrew',
      id: 4123,
      points: 1,
      summary: 'example',
  }, {
      name: 'mike',
      id: 0522,
      points: 5,
      summary: 'example',
  }]

我需要总结每个人的积分,我面临的问题是有超过50个不同的人名,所以我不能做这样的事情

for (let i = 0; i < issues.length; i++) {
    if (issues[i].name == 'mike') {
        //////////////////////
    }
}

因为将来的API可以返回new Person

2 个答案:

答案 0 :(得分:1)

您可reduce进入由name索引的对象:

const input = [{
   name: 'mike',
   id: 3312,
   points: 2,
   summary: 'example',
},
{
   name: 'andrew',
   id: 4123,
   points: 1, 
   summary: 'example',
},
{
   name: 'mike',
   id: 0522,
   points: 5,
   summary: 'example',
}];
const points = input.reduce((a, { name, points }) => (
  Object.assign(a, { [name]: (a[name] || 0) + points })
), {});
console.log(points);

答案 1 :(得分:0)

如果您不想使用reduce并保持简单,您仍然可以使用forEach循环,如下所示:

&#13;
&#13;
const input = [{
   name: 'mike',
   id: 3312,
   points: 2,
   summary: 'example',
},
{
   name: 'andrew',
   id: 4123,
   points: 1, 
   summary: 'example',
},
{
   name: 'mike',
   id: 0522,
   points: 5,
   summary: 'example',
}];

var res = {};

input.forEach((obj) => {
  res[obj.name] = res[obj.name] ? res[obj.name]+obj.points : obj.points;
});


console.log(res);
&#13;
&#13;
&#13;