我正在尝试按年和月对数组进行排序 这是我的意见:
var MyArray = ["2015-Jun", "2014-Nov", "2015-Dec", "2014-Aug", "2015-May"];
我想要这个输出:
[ "2014-Aug", "2014-Nov", "2015-May", "2015-Jun", "2015-Dec" ]
我找到了这个例子:http://jsfiddle.net/Tw6xt/63/
它几乎可以工作。输出:
2014-May,2015-Jun,2015-Dec,2014-Aug,2014-Nov
我做错了什么?
答案 0 :(得分:2)
您正在使用的setDate()方法设置了该月的某一天(1到31),并且因为您将一年“2015”传递给它,所以会给您一些意想不到的结果。
错误的:
ad.setDate(as[0]);
您需要做的是改用setFullYear()方法。
ad.setFullYear(as[0]);
HTML
<div>Before sort: <span id="before"></span></div>
<div>After sort: <span id="after"></span></div>
JS
var MyArray = ["2015-Jun", "2014-May", "2015-Dec", "2014-Aug", "2014-Nov"];
document.getElementById("before").innerHTML = String(MyArray);
(function () {
MyArray.sort(function (a,b) {
var ad = new Date(),
bd = new Date(),
months = {
Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5,
Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov:10, Dec:12
};
var as = a.split('-'),
bs = b.split('-');
ad.setFullYear(as[0]);
ad.setMonth(months[as[1]]);
bd.setFullYear(bs[0]);
bd.setMonth(months[bs[1]]);
return ad - bd;
});
})();
document.getElementById("after").innerHTML = String(MyArray);
输出
Before sort: 2015-Jun,2014-May,2015-Dec,2014-Aug,2014-Nov
After sort: 2014-May,2014-Aug,2014-Nov,2015-Jun,2015-Dec
答案 1 :(得分:1)
我会将排序更改为:
MyArray.sort(function (a,b) {
var as = a.split('-'),
bs = b.split('-');
if(parseInt(as[0])<parseInt(bs[0])){
if(months[as[1]]<months[bs[1]])
return -1;
else if(months[as[1]]>months[bs[1]])
return 1;
else
return 0;
}else if(parseInt(as[0])>parseInt(bs[0])){
return 1;
}
return 0;
});
这将首先按年订购,然后逐月订购,产量:2014年5月,2014年8月,2014年11月,2015年6月,2015年12月 - 12月