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

如何从年份数组与JSON对象生成按年份聚合的数组

需求说明

我需要将存储唯一年份的数组,与包含Year和VALUE字段的JSON对象数组结合,生成一个按年份聚合的结果数组——每个年份仅出现一次,对应年份的所有数值以数组形式存储。

预期输出

data = [
  { year: 2015, value: [10,20,30] }, 
  { year: 2016, value: [50,60,70] },
  { year: 2017, value: [100,200,0] } 
]

输入数据

唯一年份数组

const Unique = [2015,2016,2017]

原始数据数组

const data = [
  { Year: 2015, VALUE: 10 },
  { Year: 2015, VALUE: 20 },
  { Year: 2015, VALUE: 30 },
  { Year: 2016, VALUE: 50 },
  { Year: 2016, VALUE: 60 },
  { Year: 2016, VALUE: 70 },
  { Year: 2017, VALUE: 100 },
  { Year: 2017, VALUE: 200 },
  { Year: 2017, VALUE: 0 },
];

尝试过的代码

let uniDs: any = [];
Unique.forEach((u) => {
  data.forEach((k) => {
    let x = uniDs.filter((x) => x.Year == u);
    if (x.length > 0) {
      x[0].value.push(k.VALUE);
    } else {
      uniDs.push({ Year: k.Year, value: [k.VALUE] });
    }
  });
});
console.log(uniDs);

解决方案

可以借助Map作为中间映射表优化聚合逻辑,避免嵌套循环带来的高时间复杂度,同时保证结果严格匹配唯一年份数组的顺序:

// 创建年份到数值数组的映射表
const yearValueMap = new Map<number, number[]>();

// 遍历原始数据填充映射
data.forEach(item => {
  const targetYear = item.Year;
  if (!yearValueMap.has(targetYear)) {
    yearValueMap.set(targetYear, []);
  }
  yearValueMap.get(targetYear)!.push(item.VALUE);
});

// 结合唯一年份数组生成最终结果
const aggregatedResult = Unique.map(year => ({
  year: year,
  value: yearValueMap.get(year) || []
}));

console.log(aggregatedResult);

代码说明

  1. 映射表聚合:用Map存储每个年份对应的数值数组,遍历原始数据时直接追加对应数值,时间复杂度为O(n)(n为原始数据长度),比嵌套循环的O(n*m)效率更高。
  2. 结果生成:遍历唯一年份数组,从映射表中取出对应数值数组,确保结果顺序与Unique数组完全一致,同时处理极端情况(若某年份无对应数据则返回空数组)。

编辑:@Konrad提供的答案完全符合我的需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:25:21