如何按指定分组键对数据项分组并求和合并其他属性值?
问题:按指定键分组并对其余属性求和汇总
给定一组数据项数组,需对除指定分组键外的所有属性值进行求和汇总。以分组键name及如下示例数据为例:
[ { name: "Name1", amt: 100, tax: 10, total: 110, }, { name: "Name2", amt: 50, tax: 5, total: 55, }, { name: "Name1", amt: 70, tax: 7, total: 77, } ]
预期结果为:
[ { name: "Name1", amt: 170, tax: 17, total: 187, }, { name: "Name2", amt: 50, tax: 5, total: 55, } ]
解决方案
方法一:原生JavaScript(使用Array.reduce)
无需依赖外部库,用原生数组方法即可实现:
const groupAndSum = (data, groupKey) => { // 按分组键聚合数据 const grouped = data.reduce((acc, item) => { const key = item[groupKey]; // 初始化分组对象(保留分组键,其他属性设为0) if (!acc[key]) { acc[key] = { [groupKey]: key }; Object.keys(item).forEach(k => { if (k !== groupKey) acc[key][k] = 0; }); } // 对非分组键的属性累加求和 Object.keys(item).forEach(k => { if (k !== groupKey) acc[key][k] += item[k]; }); return acc; }, {}); // 将聚合后的对象转为数组返回 return Object.values(grouped); }; // 测试示例 const data = [ { name: "Name1", amt: 100, tax: 10, total: 110 }, { name: "Name2", amt: 50, tax: 5, total: 55 }, { name: "Name1", amt: 70, tax: 7, total: 77 } ]; const result = groupAndSum(data, 'name'); console.log(result);
方法二:使用Lodash工具库
如果项目已引入Lodash,可借助其封装好的方法简化代码:
const _ = require('lodash'); const groupAndSum = (data, groupKey) => { // 按分组键分组 const grouped = _.groupBy(data, groupKey); // 对每个分组内的对象合并求和 return Object.values(_.mapValues(grouped, items => { return _.mergeWith({}, ...items, (a, b) => { // 数字类型属性求和,非数字属性保留原值(如分组键) return _.isNumber(a) ? a + b : b; }); })); }; // 测试示例 const data = [ { name: "Name1", amt: 100, tax: 10, total: 110 }, { name: "Name2", amt: 50, tax: 5, total: 55 }, { name: "Name1", amt: 70, tax: 7, total: 77 } ]; const result = groupAndSum(data, 'name'); console.log(result);
内容的提问来源于stack exchange,提问作者Jiji G2A
相关产品推荐
相关产品推荐

