如何从年份数组与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);
代码说明
- 映射表聚合:用
Map存储每个年份对应的数值数组,遍历原始数据时直接追加对应数值,时间复杂度为O(n)(n为原始数据长度),比嵌套循环的O(n*m)效率更高。 - 结果生成:遍历唯一年份数组,从映射表中取出对应数值数组,确保结果顺序与
Unique数组完全一致,同时处理极端情况(若某年份无对应数据则返回空数组)。
编辑:@Konrad提供的答案完全符合我的需求。
内容的提问来源于stack exchange,提问作者Prathamesh Koyande
相关产品推荐
相关产品推荐

