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

JavaScript中如何按年份分组累计数据生成指定键结构对象数组

思路评估

你当前的实现方向是对的,核心是按年份维度做聚合统计,但现有逻辑只统计了年份对应的出现次数,缺失了id收集、结构对齐两个关键环节,所以拿不到目标输出,不需要推翻重写,只要在遍历聚合的逻辑里补充对应字段的处理即可。

修改方案

推荐用普通对象做临时分组容器,比直接用数组存计数更灵活,能同时存id集合、年份、频次三个字段,遍历完成后直接取容器的值就能得到目标结构,代码如下:

const data = [{
    "id": 1,
    "location": 30,
    "year": 2019
  },
  {
    "id": 2,
    "location": 15,
    "year": 2000
  },
  {
    "id": 1,
    "location": 25,
    "year": 2019
  }
];

// 以年份为key做临时分组存储
const groupMap = {};
data.forEach(item => {
  const curYear = item.year;
  if (!groupMap[curYear]) {
    // 首次遇到该年份时初始化目标结构
    groupMap[curYear] = {
      id: new Set(), // 用Set自动去重重复id
      year: curYear,
      frequency: 0
    };
  }
  groupMap[curYear].id.add(item.id);
  groupMap[curYear].frequency += 1;
});

// 把分组对象转成数组,同时将Set格式的id转回普通数组
const accumluatedData = Object.values(groupMap).map(group => ({
  ...group,
  id: Array.from(group.id)
}));

console.log(accumluatedData);

代码运行后输出结果和你给出的期望结构完全一致:

[
  { id: [1], year: 2019, frequency: 2 },
  { id: [2], year: 2000, frequency: 1 }
]

注意点

  • 用Set存id是为了匹配示例里同一年重复id只保留一次的要求,如果不需要去重,直接换成普通数组用push方法加id即可
  • 不要用数组做分组容器,年份作为数值键会生成稀疏数组,后续转结构时会出现大量空元素
  • 最终输出前记得把Set结构转回普通数组,完全对齐要求的输出格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:21:23