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

如何在JavaScript ES6中按年份和月份对数组进行排序

解决同时按年份和月份排序的问题

嘿,我太懂你这种困扰了——单独排年份或者月份都顺顺当当,但把两个条件放一起时,后一步排序直接把前一步的结果冲没了,对吧?问题出在你可能是分两次调用sort()方法,而sort()是原地修改数组的,第二次排序自然就覆盖了第一次的成果。

正确的做法是在一次sort()调用里完成多优先级的排序:先按年份排序,当年份相同时,再按月份的自然顺序排序。这里的关键是把月份字符串转换成可比较的数字,毕竟直接比'Mar'和'Apr'的字符串大小是不靠谱的。

给你写个完整的实现示例:

const array = [ 
  { Year: 2018, Month: 'Dec' }, 
  { Year: 2017, Month: 'Apr' }, 
  { Year: 2018, Month: 'Mar' }, 
  { Year: 2018, Month: 'Oct' }, 
  { Year: 2017, Month: 'Jan' }, 
  { Year: 2018, Month: 'Apr' } 
];

// 先定义月份到数字的映射,方便按自然顺序比较
const monthOrder = {
  Jan: 1, Feb: 2, Mar: 3, Apr: 4,
  May: 5, Jun: 6, Jul: 7, Aug: 8,
  Sep: 9, Oct: 10, Nov: 11, Dec: 12
};

// 一次调用sort完成多条件排序(用[...array]复制原数组,避免修改原数据)
const sortedArray = [...array].sort((a, b) => {
  // 第一优先级:年份排序
  if (a.Year !== b.Year) {
    return a.Year - b.Year; // 升序(早年份在前),要降序就改成 b.Year - a.Year
  }
  // 第二优先级:年份相同时,按月份排序
  return monthOrder[a.Month] - monthOrder[b.Month]; // 同样,降序就反过来
});

console.log(sortedArray);

代码逻辑说明:

  1. 我用[...array]先复制了原数组,避免sort()修改原数组(如果你不在意原数组被修改,可以直接用array.sort(...))。
  2. 排序函数里先判断年份是否不同:如果不同,直接返回年份的差值,这样年份小的元素会排在前面。
  3. 当年份相同时,就用monthOrder把月份转成数字,再比较数字的差值,保证月份按1-12的顺序排列。

运行这段代码后,你会得到按年份升序,同年份下月份升序的结果:

[
  { Year: 2017, Month: 'Jan' },
  { Year: 2017, Month: 'Apr' },
  { Year: 2018, Month: 'Mar' },
  { Year: 2018, Month: 'Apr' },
  { Year: 2018, Month: 'Oct' },
  { Year: 2018, Month: 'Dec' }
]

如果想要降序排列,只需要把对应的差值反过来就行,比如年份降序的话,就把a.Year - b.Year改成b.Year - a.Year,月份同理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:11:37