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

JavaScript按Phase分组并动态求和数值字段的实现方案(含Lodash)

实现按Phase分组并对数值字段求和的JavaScript方案

没问题!不管用不用Lodash都能搞定这个分组求和的需求,我给你两种实用方案,你可以根据项目情况选择:

原生JavaScript实现(无依赖)

这种方案不需要引入任何库,完全用原生JS API实现,适合不想额外加依赖的项目。核心思路是先用reduce按Phase分组,再对每个分组里的动态数值字段逐个累加,最后把结果转成你需要的字符串格式:

const data = [
  { Phase: "Phase 1", Value1: "5", Value2: "4" },
  { Phase: "Phase 1", Value1: "3", Value2: "7" },
  { Phase: "Phase 1", Value1: "5", Value2: "2" },
  { Phase: "Phase 1", Value1: "2", Value2: "1" },
  { Phase: "Phase 2", Value1: "1", Value2: "3" },
  { Phase: "Phase 2", Value1: "4", Value2: "8" },
  { Phase: "Phase 2", Value1: "5", Value2: "1" },
  { Phase: "Phase 2", Value1: "1", Value2: "1" }
];

// 第一步:按Phase分组并初始化求和容器
const groupedData = data.reduce((acc, currentItem) => {
  const phase = currentItem.Phase;
  // 如果该分组不存在,就创建一个新的对象,Phase字段赋值,数值字段初始化为0
  if (!acc[phase]) {
    acc[phase] = { Phase: phase };
    // 自动提取所有数值字段的键(排除Phase)
    const valueKeys = Object.keys(currentItem).filter(key => key !== 'Phase');
    valueKeys.forEach(key => acc[phase][key] = 0);
  }
  // 遍历数值字段,把字符串转成数字累加
  const valueKeys = Object.keys(currentItem).filter(key => key !== 'Phase');
  valueKeys.forEach(key => {
    acc[phase][key] += Number(currentItem[key]);
  });
  return acc;
}, {});

// 第二步:把分组后的对象转成数组,并将数值转回字符串格式
const finalResult = Object.values(groupedData).map(item => {
  const valueKeys = Object.keys(item).filter(key => key !== 'Phase');
  valueKeys.forEach(key => {
    item[key] = String(item[key]);
  });
  return item;
});

console.log(finalResult);
// 输出:[ { Phase: "Phase 1", Value1: "15", Value2: "14" }, { Phase: "Phase 2", Value1: "11", Value2: "13" } ]

使用Lodash实现(代码更简洁)

如果你的项目已经在使用Lodash,那用它的工具函数可以让代码更简洁,核心用_.groupBy分组,再结合_.map和_.sumBy来计算求和:

const _ = require('lodash');

const data = [
  { Phase: "Phase 1", Value1: "5", Value2: "4" },
  { Phase: "Phase 1", Value1: "3", Value2: "7" },
  { Phase: "Phase 1", Value1: "5", Value2: "2" },
  { Phase: "Phase 1", Value1: "2", Value2: "1" },
  { Phase: "Phase 2", Value1: "1", Value2: "3" },
  { Phase: "Phase 2", Value1: "4", Value2: "8" },
  { Phase: "Phase 2", Value1: "5", Value2: "1" },
  { Phase: "Phase 2", Value1: "1", Value2: "1" }
];

// 按Phase分组
const grouped = _.groupBy(data, 'Phase');

// 处理每个分组,计算数值字段的总和
const finalResult = _.map(grouped, (items, phase) => {
  // 提取数值字段的键
  const valueKeys = Object.keys(items[0]).filter(key => key !== 'Phase');
  const summedItem = { Phase: phase };
  // 对每个数值字段求和,转成字符串
  valueKeys.forEach(key => {
    summedItem[key] = String(_.sumBy(items, item => Number(item[key])));
  });
  return summedItem;
});

console.log(finalResult);
// 输出和原生方案完全一致

额外说明

两种方案都支持动态数值字段——不管以后新增多少个类似Value3、Value4的字段,代码都能自动识别并求和,不需要修改核心逻辑,非常灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:12:36