Javascript 排序日期不返回已排序的日期

Javascript 排序日期不返回已排序的日期,javascript,jquery,Javascript,Jquery,出于某种奇怪的原因,我编写了以下函数,用于将日期字符串数组转换为javascript日期对象,对它们进行排序,然后返回排序后的日期字符串数组,但排序不正确: sortdates: function(dates, separator) { var sorteddates = [], datestr =[]; sorteddates = dates.map(function(val) { return new Date(val.replace("/"+

出于某种奇怪的原因,我编写了以下函数,用于将日期字符串数组转换为javascript日期对象,对它们进行排序,然后返回排序后的日期字符串数组,但排序不正确:

sortdates: function(dates, separator) {
    var sorteddates = [],
        datestr =[];
    sorteddates = dates.map(function(val) {
        return new Date(val.replace("/"+separator+"/g", " "));
    }).sort();
    for ( i=0; i<sorteddates.length; i++ ) {
        datestr.push((sorteddates[i].getMonth()+1) + "-" + sorteddates[i].getDate() + "-" + sorteddates[i].getFullYear());
    }
    return datestr;
}
我将以下内容记录到控制台:

["8-2-2013", "8-3-2013", "8-4-2013", "8-11-2013", "8-18-2013", "8-25-2013", "8-1-2013", "8-8-2013", "8-15-2013", "8-22-2013", "9-5-2013", "9-12-2013", "8-7-2013", "8-14-2013"]
显然未排序。

将按“字典”顺序排序,而不是数字或日期/时间顺序。如果这些值不是字符串,它们将获得默认的字符串转换,而对于日期,该转换不会为您提供有用的排序依据

但您可以提供一个自定义排序回调,它知道如何对日期进行排序:

.sort(function(a,b) { return a.getTime() - b.getTime(); });
演示:

sort()
将根据数组中条目的字符串表示形式进行排序。在本例中,日期的字符串表示形式类似于2013年8月1日星期四00:00:00 GMT-0700(PDT),因此主要排序将按字母顺序按星期几进行

2013年8月2日星期五00:00:00 GMT-0700(PDT)
2013年8月3日星期六00:00:00 GMT-0700(PDT)
2013年8月4日星期日00:00:00 GMT-0700(PDT)
2013年8月11日星期日00:00:00 GMT-0700(PDT)
2013年8月18日星期日00:00:00 GMT-0700(PDT)
2013年8月25日星期日00:00:00 GMT-0700(PDT)
2013年8月1日星期四00:00:00 GMT-0700(PDT)
2013年8月8日星期四00:00:00 GMT-0700(PDT)
2013年8月15日星期四00:00:00 GMT-0700(PDT)
2013年8月22日星期四00:00:00 GMT-0700(PDT)
2013年9月5日星期四00:00:00 GMT-0700(PDT)
2013年9月12日星期四00:00:00 GMT-0700(PDT)
2013年8月7日星期三00:00:00 GMT-0700(PDT)
2013年8月14日星期三00:00:00 GMT-0700(PDT)
您可能想看看如何使用自定义排序回调函数,或者使用日期的其他表示形式—可以从将数组映射到时间戳值而不是
date
对象开始

return new Date(/* stuff */).getTime();
…以及稍后在函数中对格式代码所做的相应更改

综上所述,像这样的函数会像您期望的那样工作:

sortdates: function(dates, separator) {
    return dates.map(function(val) {
        return new Date(val.replace("/"+separator+"/g", " ")).getTime();
    }).sort().map(function(val) {
        var d = new Date(val);
        return (d.getMonth()+1) + "-" + d.getDate() + "-" + d.getFullYear();
    });
}
sortdates: function(dates, separator) {
    return dates.map(function(val) {
        return new Date(val.replace("/"+separator+"/g", " ")).getTime();
    }).sort().map(function(val) {
        var d = new Date(val);
        return (d.getMonth()+1) + "-" + d.getDate() + "-" + d.getFullYear();
    });
}