基于ES6实现分组(Group By)与求和(SUM)功能
按material_no分组并对qty求和的ES6实现
这题用ES6的Array.prototype.reduce()就能轻松搞定,我给你写个完整的可运行实现,再拆解下逻辑:
完整代码
const data = [ { material_no: '1001', material_name: 'Material 1', qty: 100 }, { material_no: '1001', material_name: 'Material 1', qty: 50 }, { material_no: '1002', material_name: 'Material 2', qty: 44 }, { material_no: '1003', material_name: 'Material 3', qty: 125 }, { material_no: '1002', material_name: 'Material 2', qty: 59 }, { material_no: '1004', material_name: 'Material 4', qty: 999 }, // 可继续添加更多数据 ]; // 核心分组求和逻辑 const groupedSumData = Object.values(data.reduce((accumulator, currentItem) => { // 以material_no作为分组的唯一标识键 const groupKey = currentItem.material_no; // 如果当前分组不存在,初始化分组对象 if (!accumulator[groupKey]) { accumulator[groupKey] = { material_no: currentItem.material_no, material_name: currentItem.material_name, qty: 0 // 初始化求和基数为0 }; } // 累加当前项的qty到对应分组 accumulator[groupKey].qty += currentItem.qty; return accumulator; }, {})); // 输出结果 console.log(groupedSumData);
逻辑拆解
reduce()的作用:遍历原数组,把每一项的数据整合到累加器(这里是初始空对象{})中- 分组键的选择:用
material_no作为分组的唯一键,确保相同物料号的项会被归到同一组 - 分组初始化:如果当前物料号还没在累加器里,就新建一个包含物料号、名称,且qty初始为0的对象
- qty累加:每次遍历到同组的项,就把它的qty加到对应分组的qty上
- 转成数组格式:最后用
Object.values()把累加器的对象值提取出来,转换成和原数组结构一致的数组(而非键值对对象)
额外说明
如果遇到同一个material_no对应不同material_name的异常数据,你可以在初始化分组时加个判断(比如只保留第一个出现的名称),或者根据业务需求做特殊处理,比如抛出提示。
内容的提问来源于stack exchange,提问作者Kay Singian
相关产品推荐
相关产品推荐

