JavaScript如何按name分组嵌套对象并汇总重量及各grade分值
分组求和实现方案
核心实现逻辑
你可以直接用Array.reduce完成分组累加,逻辑很容易理解:
- 用一个对象作为累加容器,key为name值,value为对应name的累计结果
- 遍历每一条数据时,若当前name已存在于容器中,直接累加对应的weight、grade各分项;若不存在则初始化一条新记录
- 最后把容器的value转成数组就是你需要的最终结果
完整实现代码
// inputData即你生成的a数组 function groupAndSum(inputData) { const groupResult = inputData.reduce((acc, current) => { const name = current.name // 首次遇到该name时初始化累加结构 if (!acc[name]) { acc[name] = { name: name, weightTotal: 0, grade: { grade1total: 0, grade2total: 0, grade3total: 0 } } } // 累加总重量 acc[name].weightTotal += current.avgTotalWeight // 累加各等级分值 acc[name].grade.grade1total += current.grade.grade1 acc[name].grade.grade2total += current.grade.grade2 acc[name].grade.grade3total += current.grade.grade3 return acc }, {}) // 把分组对象转为数组输出 return Object.values(groupResult) }
运行效果
把你提供的示例数据传入函数后,返回结果如下:
[ { name: "france Naicin", weightTotal: 58, grade: { grade1total: 58, grade2total: 0, grade3total: 0 } }, { name: "pacific gigas", weightTotal: 16, grade: { grade1total: 16, grade2total: 0, grade3total: 0 } } ]
额外优化点
你之前生成a数组的代码里,grade的赋值逻辑可以简化,无需写多段if判断:
// 替换原来的grade赋值代码即可 const grade1 = alias === "G1" ? avgTotalWeight : 0 const grade2 = alias === "G2" ? avgTotalWeight : 0 const grade3 = alias === "G3" ? avgTotalWeight : 0
内容的提问来源于stack exchange,提问作者Michal Kubiak
相关产品推荐
相关产品推荐

