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

按指定键(如年份)汇总对象数组数据的代码问题:现有实现未达预期结果

问题排查与解决方案

先说说你当前代码里的几个核心问题:

  • 你初始化的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);

代码解释

  1. reduce的作用:遍历原数组,把每一项根据year字段归类到对应的分组对象里
  2. 初始化分组对象:如果某个年份还没在累加器里,就创建一个包含年份字段、且汇总字段初始为0的对象
  3. 累加数值:对每个需要汇总的字段,把当前项的值加到对应分组的字段上
  4. Object.values:把累加器里的对象(key是年份,value是汇总对象)转成数组,就是你要的预期格式

运行这段代码后,输出就是你想要的结果:

[
  { "abc": 50, "xyz": 40, "year": "2021" },
  { "abc": 60, "xyz": 40, "year": "2022" }
]

这种方式不仅逻辑清晰,而且扩展性很强——如果以后要换分组字段(比如按季度)或者增减汇总字段,只需要修改groupKey和sumKeys就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:53:13