从当前月份开始排序数组

时间:2014-04-15 08:56:34

标签: javascript arrays sorting

我有几个月和几年的数组 - 这个月被显示为1到12之间的数字。我想对数组进行排序,以便我可以先显示当前当月的数字。

allMonths = [month: 1 year: 2013 value: 25, 
      month: 1 year: 2014 value: 17,
      month: 2 year: 2013 value: 10,
      month: 2 year: 2014 value: 16,
      month: 3 year: 2013 value: 25, 
      month: 3 year: 2014 value: 17,
      month: 4 year: 2013 value: 10,
      month: 4 year: 2014 value: 16,
      ......etc ]

allMonths.sort(function(a, b){
if (a.year > b.year) 
     return 1;               
if (a.month < b.month) 
     return -1;
}) 

我希望输出显示从当月开始的过去12个月的值(我不需要显示年份)...

4: 16 (Apr 2014)
3 : 17(March 2014)
2: 16 (Feb  2014)
1: 16 (Jan 2014)
12 : 17(Dec 2013)
11: 16 (Nov 2013)
...etc

我没有太多排序数组的经验,所以我有点迷失

2 个答案:

答案 0 :(得分:2)

如果年份相同,则返回月份之间的差异,否则返回年份之间的差异。

allMonths.sort(function(a, b) {
    if (a.year === b.year) {
        return a.month - b.month;
    }
    return a.year - b.year;
});

如果你想按降序对数组进行排序(最近的事情是先行),只需交换比较年份和月份的顺序,就像这样

allMonths.sort(function(a, b) {
    if (a.year === b.year) {
        return b.month - a.month;
    }
    return b.year - a.year;
});

可以用三元表达式简洁地写出来,就像这样

allMonths.sort(function(a, b) {
    return a.year === b.year ? b.month - a.month : b.year - a.year;
});

注意:不保证JavaScript的排序是稳定的。

答案 1 :(得分:1)

看看Sorting in JavaScript: Should every compare function have a "return 0" statement?。另请注意,当年/月不大于另一年时,它仍然可能更小,这需要优先于进一步的排序。尝试

allMonths.sort(function(a, b) {
    if (a.year > b.year)
         return 1;
    if (a.year < b.year)
         return -1;
    if (a.month > b.month)
         return 1;
    if (a.month < b.month)
         return -1;
    return 0;
})

编写数字比较函数的简短方法是

allMonths.sort(function(a, b) {
    return a.year-b.year || a.month-b.month;
})