我有几个月和几年的数组 - 这个月被显示为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
我没有太多排序数组的经验,所以我有点迷失
答案 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;
})