按指定键(如年份)汇总对象数组数据的代码问题:现有实现未达预期结果
问题排查与解决方案
先说说你当前代码里的几个核心问题:
- 你初始化的
newObject是单个对象,但预期输出是数组,没法存储多个年份的分组结果 - 没有按
year字段做分组逻辑,所有数据都在同一个对象里累加,完全没区分2021和2022 - 累加时没有先初始化属性值,直接
newObject[key] += ...会得到NaN(因为初始是undefined) - 逻辑里的
col[key]完全错误:col是字符串"year",col[key]相当于取"year"这个字符串的key索引,结果都是undefined
正确实现方案
我们可以用Array.reduce来高效完成分组汇总,这是处理这类分组累加场景的标准做法:
const dataArray = [ { "abc": 10, "xyz": 20, "year": "2021" }, { "abc": 20, "xyz": 20, "year": "2022" }, { "abc": 20, "xyz": 10, "year": "2021" }, { "abc": 30, "xyz": 10, "year": "2022" }, { "abc": 20, "xyz": 10, "year": "2021" }, { "abc": 10, "xyz": 10, "year": "2022" } ]; const groupKey = "year"; // 按哪个字段分组 const sumKeys = ["abc", "xyz"]; // 需要汇总的字段 // 用reduce分组累加 const groupedResult = Object.values(dataArray.reduce((acc, item) => { // 获取当前项的分组键值(比如2021/2022) const key = item[groupKey]; // 如果当前分组还不存在,初始化一个新对象 if (!acc[key]) { acc[key] = { [groupKey]: key }; // 初始化需要汇总的字段为0 sumKeys.forEach(k => acc[key][k] = 0); } // 累加对应字段的值 sumKeys.forEach(k => acc[key][k] += item[k]); return acc; }, {})); console.log(groupedResult);
代码解释
reduce的作用:遍历原数组,把每一项根据year字段归类到对应的分组对象里- 初始化分组对象:如果某个年份还没在累加器里,就创建一个包含年份字段、且汇总字段初始为0的对象
- 累加数值:对每个需要汇总的字段,把当前项的值加到对应分组的字段上
Object.values:把累加器里的对象(key是年份,value是汇总对象)转成数组,就是你要的预期格式
运行这段代码后,输出就是你想要的结果:
[ { "abc": 50, "xyz": 40, "year": "2021" }, { "abc": 60, "xyz": 40, "year": "2022" } ]
这种方式不仅逻辑清晰,而且扩展性很强——如果以后要换分组字段(比如按季度)或者增减汇总字段,只需要修改groupKey和sumKeys就行。
内容的提问来源于stack exchange,提问作者ketan
相关产品推荐
相关产品推荐

