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
相关产品推荐
相关产品推荐

