javascript - 按特定键和总和聚合对象数组
问题描述
我有以下数组填充了一些对象:
const data = [
{date: '8 - 2021', 'a20 - plan1': 20, 'b70 - plan1': 10, 'c30 - plan1': 5},
{date: '9 - 2021', 'a20 - plan1': 60, 'b70 - plan1': 70, 'c30 - plan1': 20},
{date: '8 - 2021', 'a20 - plan1': 10, 'b70 - plan1': 5, 'c30 - plan1': 5},
{date: '9 - 2021', 'a20 - plan1': 5, 'b70 - plan1': 5, 'c30 - plan1': 5}
];
我想按 分组并对date
相等的字段求和,从而得到以下数组:
const data = [
{date: '8 - 2021', 'a20 - plan1': 30, 'b70 - plan1': 15, 'c30 - plan1': 10},
{date: '9 - 2021', 'a20 - plan1': 65, 'b70 - plan1': 75, 'c30 - plan1': 25},
];
如果我能得到任何帮助,我会很高兴,在此先感谢!
解决方案
使用简单的 reduce 可以为您提供解决方案。首先,使用字典插入第一组唯一的“日期”作为键和对象作为值,当您找到另一个匹配的日期键时,只需将当前值与保存在字典中的前一个值相加。
const data = [
{date: '8 - 2021', 'a20 - plan1': 20, 'b70 - plan1': 10, 'c30 - plan1': 5},
{date: '9 - 2021', 'a20 - plan1': 60, 'b70 - plan1': 70, 'c30 - plan1': 20},
{date: '8 - 2021', 'a20 - plan1': 10, 'b70 - plan1': 5, 'c30 - plan1': 5},
{date: '9 - 2021', 'a20 - plan1': 5, 'b70 - plan1': 5, 'c30 - plan1': 5}
];
let dictionary = data.reduce((dic, value)=> {
if(!dic[value.date])
{dic[value.date] = value; } else {
let old = dic[value.date];
Object.keys(old).forEach((key)=> { if(key != 'date') { old[key] += value[key] } } )
} return dic } ,{});
let result = Object.values(dictionary);
console.log(result);