Vue中如何按年份分组对象数组并生成含唯一年份键的新数组
按年份分组并排序生成新数组的最优实现
我需要把一个包含年份字段的对象数组,转换成按年份分组且按年份倒序排列的新数组。
原始数组格式如下:
[ {id: 42, count: 250, month: "January", year: 2024}, {id: 37, count: 2023, month: "January", year: 2023}, {id: 1, count: 1111, month: "January", year: 2022}, {id: 2, count: 100, month: "February", year: 2022}, {id: 3, count: 500, month: "March", year: 2022}, {id: 6, count: 1, month: "April", year: 2022}, {id: 8, count: 500, month: "May", year: 2022} ];
需要生成的目标数组格式:
[ { 2024: [{id: 42, count: 250, month: "January", year: 2024}] }, { 2023: [{id: 37, count: 2023, month: "January", year: 2023}] }, { 2022: [ {id: 1, count: 1111, month: "January", year: 2022}, {id: 2, count: 100, month: "February", year: 2022}, {id: 3, count: 500, month: "March", year: 2022}, {id: 6, count: 1, month: "April", year: 2022}, {id: 8, count: 500, month: "May", year: 2022} ] }, ]
最优实现方法
用reduce完成分组,再结合Object.entries、sort和map生成目标数组,整体时间复杂度低,代码简洁:
const originalData = [ {id: 42, count: 250, month: "January", year: 2024}, {id: 37, count: 2023, month: "January", year: 2023}, {id: 1, count: 1111, month: "January", year: 2022}, {id: 2, count: 100, month: "February", year: 2022}, {id: 3, count: 500, month: "March", year: 2022}, {id: 6, count: 1, month: "April", year: 2022}, {id: 8, count: 500, month: "May", year: 2022} ]; // 按年份分组 const groupedByYear = originalData.reduce((acc, item) => { const year = item.year; acc[year] = acc[year] || []; acc[year].push(item); return acc; }, {}); // 转换为目标格式并按年份倒序排序 const result = Object.entries(groupedByYear) .sort(([year1], [year2]) => year2 - year1) .map(([year, items]) => ({ [year]: items })); console.log(result);
实现说明
- 分组阶段:
reduce遍历一次原始数组,以年份为键存储对应的数据项,这是最高效的分组方式,时间复杂度为O(n)。 - 转换与排序阶段:
Object.entries把分组后的对象转为[年份, 对应数组]的键值对数组;sort按年份数值倒序排列(数字直接相减即可实现排序);map把每个键值对转换为目标格式的单个对象。
整个流程只需要遍历原始数组一次,排序操作的对象是分组后的年份数量(通常远小于原始数组长度),性能最优。
内容的提问来源于stack exchange,提问作者albert_anthony6
相关产品推荐
相关产品推荐

