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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:27:17