JS如何将对象数组按属性分组、拆分并按年份聚合对应数据
JS多维聚合最优实现方案
你之前先按年份分组再拆分统计的方式会产生额外的遍历开销,我们可以通过一次遍历完成两级聚合,整体时间复杂度为O(n),实现逻辑如下:
实现代码
// 第一阶段:聚合生成 level -> 年份 -> 累计金额 的映射结构 const levelYearAgg = data.reduce((result, current) => { const year = current.transactiondate.slice(0,4) const level = current.level const amount = Number(current.amount) // 初始化当前level的年份统计对象 result[level] = result[level] ?? {} // 累加对应年份的金额 result[level][year] = (result[level][year] ?? 0) + amount return result }, {}) // 第二阶段:转换为目标输出结构,同时保证年份升序 const output = Object.entries(levelYearAgg).map(([levelName, yearSumMap]) => { // 对年份做升序排序 const sortedYears = Object.keys(yearSumMap).sort() // 按排序后的年份提取对应累计金额 return { name: levelName, data: sortedYears.map(year => yearSumMap[year]) } })
方案说明
- 仅需遍历一次原始数据完成核心聚合逻辑,后续排序仅针对去重后的年份集合,开销远小于重复遍历原始数据
- 自动适配任意数量的level和年份,无需硬编码年份区间
- 用你提供的示例数据运行该代码,输出结果完全匹配预期格式:
level 1的data为[5,11],level 2的data为[30,50]
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

