如何在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);
代码逻辑说明:
- 我用
[...array]先复制了原数组,避免sort()修改原数组(如果你不在意原数组被修改,可以直接用array.sort(...))。 - 排序函数里先判断年份是否不同:如果不同,直接返回年份的差值,这样年份小的元素会排在前面。
- 当年份相同时,就用
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
相关产品推荐
相关产品推荐

