You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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);

逻辑拆解

  1. reduce()的作用:遍历原数组,把每一项的数据整合到累加器(这里是初始空对象{})中
  2. 分组键的选择:用material_no作为分组的唯一键,确保相同物料号的项会被归到同一组
  3. 分组初始化:如果当前物料号还没在累加器里,就新建一个包含物料号、名称,且qty初始为0的对象
  4. qty累加:每次遍历到同组的项,就把它的qty加到对应分组的qty上
  5. 转成数组格式:最后用Object.values()把累加器的对象值提取出来,转换成和原数组结构一致的数组(而非键值对对象)

额外说明

如果遇到同一个material_no对应不同material_name的异常数据,你可以在初始化分组时加个判断(比如只保留第一个出现的名称),或者根据业务需求做特殊处理,比如抛出提示。

内容的提问来源于stack exchange,提问作者Kay Singian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:34:15