Javascript 按键对数组进行分组,然后求和总数

Javascript 按键对数组进行分组,然后求和总数,javascript,Javascript,我正试图操纵一个数据数组,以便它按一个键分组,然后包含一个属性,该属性显示每个组的总数,以及所有组的总数,但是我遇到了麻烦 这是我开始使用的数据: [ {paren: 'abc', details: '', value: 100}, {paren: 'abc', details: '', value: 120}, {paren: 'vav', details: '', value: 400}, {paren: 'aol', details: '', value: 40},

我正试图操纵一个数据数组,以便它按一个键分组,然后包含一个属性,该属性显示每个组的总数,以及所有组的总数,但是我遇到了麻烦

这是我开始使用的数据:

[ 
  {paren: 'abc', details: '', value: 100},
  {paren: 'abc', details: '', value: 120},
  {paren: 'vav', details: '', value: 400},
  {paren: 'aol', details: '', value: 40},
  {paren: 'ckk', details: '', value: 400},
  {paren: 'vav', details: '', value: 20}
]
这就是我想要的结局。total是组内所有对象的值之和,grandTotal是组内所有对象的值之和

const groupings = {
  grandTotal: 1080,
  groupings: [
    {
      group: 'abc', 
      data: [      
        {paren: 'abc', details: '', value: 100},
        {paren: 'abc', details: '', value: 120},
      ],
      total: 220
    },

    {
      group: 'vav', 
      data: [      
        {paren: 'vav', details: '', value: 400},
        {paren: 'vav', details: '', value: 20}
      ],
      total: 420
    },

    {
      group: 'aol', 
      data: [      
        {paren: 'aol', details: '', value: 40},
      ],
      total: 40
    },

    {
      group: 'ckk', 
      data: [      
        {paren: 'ckk', details: '', value: 400},
      ],
      total: 400
    },
  ]
};
我一直在尝试使用reduce/map的组合来实现这一点,我已经非常接近了。我唯一没有弄明白的是如何有效地计算总数。这是我的代码:

const mapGroups = array.reduce((obj, item) => {
  obj[item.paren] = obj[item.paren] || [];
  obj[item.paren].push(item);
  return obj;
}, {});

return Object.keys(mapGroups).map((key) => {
  return {group: key, data: mapGroups[key]};
});

任何帮助都将不胜感激。

传递一个对象,该对象包含您希望
减少的整个结构。然后可以在循环期间更新嵌套对象。这允许您将每个运行总计和总计相加

最后,您可以将
groupings
对象替换为其值数组

const数组=[
{paren:'abc',详细信息:'',值:100},
{paren:'abc',详细信息:'',值:120},
{paren:'vav',详细信息:'',值:400},
{paren:'aol',详细信息:'',值:40},
{paren:'ckk',详细信息:'',值:400},
{paren:'vav',详细信息:'',值:20}
];
常量映射组=数组.reduce((对象,项)=>{
对象分组[item.paren]=对象分组[item.paren]|{
组:item.paren,
数据:[],
总数:0
};
对象分组[item.paren].data.push(item);
对象分组[item.paren].total+=item.value;
obj.grandTotal+=项目价值;
返回obj;
},{grandTotal:0,分组:{});
mapGroups.groupings=Object.values(mapGroups.groupings);
console.log(映射组)