使用JavaScript reduce方法同时按category和level统计mainUnits与subUnits
实现按category和level双重维度统计数据
原代码仅完成了按category汇总mainUnits和subUnits的总数,现在需要扩展为同时按level(格式化为levelA、levelB这类键)统计对应级别的数值,最终每个分类对象需包含总数和各level的细分统计。
修改后的完整代码如下:
const input = [ { category: 1, level: 'B', mainUnits: 5, subUnits: 3, }, { category: 1, level: 'B', mainUnits: 9, subUnits: 12, }, { category: 2, level: 'A', mainUnits: 4, subUnits: 6, }, { category: 2, level: 'B', mainUnits: 2, subUnits: 4, }, ]; const result = input.reduce((acc, item) => { // 查找当前category对应的统计对象 let categoryItem = acc.find(x => x.category === item.category); if (!categoryItem) { // 未找到则初始化基础结构 categoryItem = { category: item.category, mainUnits: 0, subUnits: 0 }; acc.push(categoryItem); } // 更新category的总统计数值 categoryItem.mainUnits += item.mainUnits; categoryItem.subUnits += item.subUnits; // 格式化level键为统一格式(如levelA、levelB) const levelKey = `level${item.level.toUpperCase()}`; // 若当前level未初始化,先创建默认统计结构 if (!categoryItem[levelKey]) { categoryItem[levelKey] = { mainUnits: 0, subUnits: 0 }; } // 更新对应level的统计数值 categoryItem[levelKey].mainUnits += item.mainUnits; categoryItem[levelKey].subUnits += item.subUnits; return acc; }, []); console.log(result);
输出结果
运行后会得到符合需求的统计数组:
[ { category: 1, mainUnits: 14, subUnits: 15, levelB: { mainUnits: 14, subUnits: 15 } }, { category: 2, mainUnits: 6, subUnits: 10, levelA: { mainUnits: 4, subUnits: 6 }, levelB: { mainUnits: 2, subUnits: 4 } } ]
核心逻辑说明
- 以
category为分组核心,遍历过程中先检查当前分类是否已存在统计对象,不存在则初始化基础结构 - 先累加当前项的数值到分类的总统计中
- 将
level转换为统一的levelX格式键名,确保结构规范 - 检查对应level的统计结构是否存在,未存在则先初始化,再累加对应数值
内容的提问来源于stack exchange,提问作者Yossi Bondasd
相关产品推荐
相关产品推荐

