我有一个这样的对象数组:
[{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
函数内部进行else
和map
检查的更好的方法了吗?
答案 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;
}, {});