如何在JavaScript中按月份对事件数组进行排序?
按日历月份顺序排序事件数组
你当前用localeCompare是按月份缩写的字母顺序排序,自然不符合真实日历顺序的要求。要搞定这个需求,直接用给定的MONTHS数组的索引位置就能实现——这个数组本身就是按日历顺序排列的,每个月份对应的索引正好对应它在一年中的先后顺序(比如JAN是0,FEB是1,以此类推)。
修改后的代码
const MONTHS = [ 'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC' ]; function sortByMonth(events) { // 通过月份在MONTHS数组中的索引差值来确定排序顺序 events.sort((a, b) => MONTHS.indexOf(a.month) - MONTHS.indexOf(b.month)); }
测试示例
const events = [ { event: 'prom', month: 'MAY' }, { event: 'graduation', month: 'JUN' }, { event: 'dance', month: 'JAN' } ]; sortByMonth(events); console.log(events); // 输出结果: // [{ event: 'dance', month: 'JAN' }, // { event: 'prom', month: 'MAY' }, // { event: 'graduation', month: 'JUN' }]
原理说明
MONTHS.indexOf(a.month)会返回该月份在顺序数组中的位置(比如MAY对应索引4,JAN对应索引0)- 用两个索引值相减的结果作为排序依据:
- 差值为负时,
a的月份更早,排在前面 - 差值为正时,
b的月份更早,排在前面 - 差值为0时,两者相对顺序保持不变
- 差值为负时,
这样就能精准实现按日历月份的先后顺序对事件数组排序。
内容的提问来源于stack exchange,提问作者Ultima
相关产品推荐
相关产品推荐

