2013-08-04 58 views
4

一些奇怪的原因如下功能我寫的日期字符串數組轉換爲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; 
} 

如果我做日期字符串的測試序列,並應用此功能:

var testarray = ["2013-8-1", "2013-8-8", "2013-8-15", "2013-8-22", "2013-9-5", "2013-9-12", "2013-8-2", "2013-8-3", "2013-8-4", "2013-8-7", "2013-8-11", "2013-8-14", "2013-8-18", "2013-8-25"]; 
console.log(sortdates(testarray, "-")); 

我得到以下登錄到控制檯:

["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"] 

顯然不排序。

回答

1

.sort()將按「字典」順序排序,而不是數字或日期/時間順序。如果這些值不是字符串,他們會得到一個默認的字符串轉換,這對於日期來說不會給你一些有用的東西來排序。

但是你可以提供一個知道如何日期排序,自定義排序回調:

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

演示:http://jsfiddle.net/TUAz9/

1

sort()將整理基礎上,陣列中的條目的字符串表示。在這種情況下,日期的字符串表示類似於Thu Aug 01 2013 00:00:00 GMT-0700 (PDT),所以按照字母順序,主要排序按星期幾排序。

Fri Aug 02 2013 00:00:00 GMT-0700 (PDT) 
Sat Aug 03 2013 00:00:00 GMT-0700 (PDT) 
Sun Aug 04 2013 00:00:00 GMT-0700 (PDT) 
Sun Aug 11 2013 00:00:00 GMT-0700 (PDT) 
Sun Aug 18 2013 00:00:00 GMT-0700 (PDT) 
Sun Aug 25 2013 00:00:00 GMT-0700 (PDT) 
Thu Aug 01 2013 00:00:00 GMT-0700 (PDT) 
Thu Aug 08 2013 00:00:00 GMT-0700 (PDT) 
Thu Aug 15 2013 00:00:00 GMT-0700 (PDT) 
Thu Aug 22 2013 00:00:00 GMT-0700 (PDT) 
Thu Sep 05 2013 00:00:00 GMT-0700 (PDT) 
Thu Sep 12 2013 00:00:00 GMT-0700 (PDT) 
Wed Aug 07 2013 00:00:00 GMT-0700 (PDT) 
Wed Aug 14 2013 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(); 
    }); 
}