在javascript对象中聚合具有相同值的键

时间:2018-09-16 23:06:59

标签: javascript

我有一个这样的对象数组:

[{state: CA, value: 1}, {state: CA, value: 1}, {state: NY, value: 10}]

我希望最终结果是一个包含相同状态值汇总的对象:

{CA: 2, NY: 10}

我在下面有以下代码:

let arr = [{state: 'CA', value: 1}, {state: 'CA', value: 1}, {state: 'NY', value: 10}];

let finalObj = {};

arr.map(function(item) {
  let state = item.state;
  if (!finalObj[state]) {
      finalObj[state] = item.value;
  }else {
      finalObj[state] += item.value;
  }
});

console.log(finalObj);

有比在if函数内部进行elsemap检查的更好的方法了吗?

1 个答案:

答案 0 :(得分:2)

首先,如果您需要简单的循环,我建议使用forEach而不是map。但是,在这种情况下,reduce是您真正想要的。我认为这是我能想到的最短的方法:

const arr = [{state: 'CA', value: 1}, {state: 'CA', value: 1}, {state: 'NY', value: 10}];

const finalObj = arr.reduce((acc, item) => {
  acc[item.state] = (acc[item.state] || 0) + item.value;
  return acc;
}, {});

您可以仅使用赋值替换if/else,而只需执行(acc[item.state] || 0)即可始终获得有效数字。

另一种选择可能是只做if部分(我认为这是一个非常干净的解决方案):

const arr = [{state: 'CA', value: 1}, {state: 'CA', value: 1}, {state: 'NY', value: 10}];

const finalObj = arr.reduce((acc, item) => {
  if(!acc[item.state]) {
    acc[item.state] = 0;
  }
  acc[item.state] += item.value;
  return acc;
}, {});