如何按name属性分组对象数组并对同组数值求和?
解决按name分组并求和数值的问题
我懂你的需求啦——你已经用_.groupBy(newArray, 'name')把数组按name分好组,但还需要把每组里的数值属性加总,而不是只保留原对象数组对吧?其实只需要在分组之后,搭配_.mapValues和数组的reduce方法就能轻松搞定。
示例代码(假设数值属性是value)
首先,假设你的原始数组结构是这样的:
const newArray = [ { name: "Apple", value: 5 }, { name: "Banana", value: 3 }, { name: "Apple", value: 7 }, { name: "Orange", value: 2 }, { name: "Banana", value: 4 } ];
接下来一步到位实现分组+求和:
// 先分组,再对每个分组的数值求和 const groupedWithSum = _.mapValues(_.groupBy(newArray, 'name'), (group) => { // 用reduce累加每组的value值 return group.reduce((total, item) => total + item.value, 0); }); console.log(groupedWithSum); // 输出结果:{ Apple: 12, Banana: 7, Orange: 2 }
如果需要返回数组形式(而非对象)
要是你希望最终结果是包含name和总和的对象数组,可以再做一步转换:
const resultArray = Object.entries(groupedWithSum).map(([name, total]) => ({ name, totalValue: total })); console.log(resultArray); // 输出结果: // [ // { name: "Apple", totalValue: 12 }, // { name: "Banana", totalValue: 7 }, // { name: "Orange", totalValue: 2 } // ]
逻辑说明
_.groupBy:负责把所有name相同的对象归类到同一个数组里,这一步你已经做对了;_.mapValues:遍历分组后的对象,对每个分组(也就是每个同名对象数组)进行处理;reduce:在每个分组内部,把所有对象的数值属性累加起来,得到该组的总和。
内容的提问来源于stack exchange,提问作者Daniel Bezerra De Menezes
相关产品推荐
相关产品推荐

