如何对对象数组中的数量值求和并保留Group分组值?
数组对象分组求和转换解决方案
问题回顾
给定对象数组:
var myArrayOfObjects = [{Group:'MD',qtyA:4,qtyB:5},{Group:'IL',qtyA:1,qtyB:3},{Group:'FL',qtyA:5,qtyB:5}];
需要转换为按Group分组、Total为qtyA与qtyB之和的新数组:
[{Group:'MD',Total:9},{Group:'IL',Total:4},{Group:'FL',Total:10}]
实现方案
方案一:reduce + Object.values(高效推荐)
利用reduce构建以Group为键的临时对象,再通过Object.values转换为目标数组,适合数据量大的场景:
const result = Object.values( myArrayOfObjects.reduce((acc, item) => { // 计算当前项的qtyA与qtyB之和 const total = item.qtyA + item.qtyB; // 将分组信息存入累加器 acc[item.Group] = { Group: item.Group, Total: total }; return acc; }, {}) );
如果原数组存在重复Group(同一Group出现多次),需要累加Total,修改逻辑如下:
const result = Object.values( myArrayOfObjects.reduce((acc, item) => { const currentTotal = item.qtyA + item.qtyB; if (acc[item.Group]) { // 已有分组,累加Total acc[item.Group].Total += currentTotal; } else { // 新分组,初始化对象 acc[item.Group] = { Group: item.Group, Total: currentTotal }; } return acc; }, {}) );
方案二:直接用reduce维护结果数组
如果数据量较小,也可以直接在reduce里遍历结果数组查找分组,代码更直观:
const result = myArrayOfObjects.reduce((acc, item) => { // 查找当前Group是否已存在于结果数组 const existingItem = acc.find(el => el.Group === item.Group); if (existingItem) { existingItem.Total += item.qtyA + item.qtyB; } else { acc.push({ Group: item.Group, Total: item.qtyA + item.qtyB }); } return acc; }, []);
注意事项
原代码中Group的值未加引号(如Group:MD),在JavaScript中会被视为未定义变量,需修正为字符串形式(Group:'MD'或Group:"MD")。
内容的提问来源于stack exchange,提问作者J James
相关产品推荐
相关产品推荐

