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

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);

实现说明

  1. 分组阶段:reduce遍历一次原始数组,以年份为键存储对应的数据项,这是最高效的分组方式,时间复杂度为O(n)。
  2. 转换与排序阶段:
    • Object.entries把分组后的对象转为[年份, 对应数组]的键值对数组;
    • sort按年份数值倒序排列(数字直接相减即可实现排序);
    • map把每个键值对转换为目标格式的单个对象。

整个流程只需要遍历原始数组一次,排序操作的对象是分组后的年份数量(通常远小于原始数组长度),性能最优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:50:16