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
相关产品推荐
相关产品推荐

