首页 > 解决方案 > 按特定键和总和聚合对象数组

问题描述

我有以下数组填充了一些对象:

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},
];

如果我能得到任何帮助,我会很高兴,在此先感谢!

标签: javascriptarraysalgorithmfrontend

解决方案


使用简单的 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);


推荐阅读