2017-02-20 40 views
0

我創建了一個非常簡單的數組排序腳本,它適用於Firefox,但鉻和即給我一個無序的數組。它真的是一個數組排序錯誤的鉻和ie?

var arr = ["2017-02-17", 
"2017-02-17", 
"2017-02-16", 
"2017-02-15", 
"2017-02-16", 
"2017-02-15", 
"2017-02-14", 
"2017-02-16", 
"2017-02-17", 
"2017-02-17", 
"2017-02-13"]; 
arr.sort(function(a, b) {return a>b;}); 
console.log(arr); 

是鉻/ ie錯誤還是我錯過了什麼?我幾乎不相信鉻和即使有不同的JS引擎也有同樣的問題。

+0

只需調用arr。排序()將做 – user93

+0

忘記的數據格式,嘗試VAR ARR = [ 「17」, 「17」, 「16」, 「15」, 「16」, 「15」, 「14」, 「16」, 「17」, 「17」, 「13」]; 它也返回我無序列表。 – user3631204

回答

1

您必須使用簡單排序而不通過callback函數。

arr.sort(); 

var arr = ["2017-02-17", 
 
"2017-02-17", 
 
"2017-02-16", 
 
"2017-02-15", 
 
"2017-02-16", 
 
"2017-02-15", 
 
"2017-02-14", 
 
"2017-02-16", 
 
"2017-02-17", 
 
"2017-02-17", 
 
"2017-02-13"]; 
 
arr.sort(); 
 
console.log(arr);

2

可能用於Array#sort正確的比較,並用它作爲返回值,而不是單個true/false,這也消除了負值,這是必要的。

雖然您有ISO 6801日期字符串,您可以使用。

var arr = ["2017-02-17", "2017-02-17", "2017-02-16", "2017-02-15", "2017-02-16", "2017-02-15", "2017-02-14", "2017-02-16", "2017-02-17", "2017-02-17", "2017-02-13"]; 
 

 
arr.sort(function(a, b) { 
 
    return a.localeCompare(b); 
 
}); 
 
console.log(arr);

如果你不關心Unicode代碼點,你可以使用Array#sort

sort()方法到位排序數組的元素,並返回陣列。排序不一定穩定。默認的排序順序是根據字符串Unicode代碼點。

沒有的compareFunction

var arr = ["2017-02-17", "2017-02-17", "2017-02-16", "2017-02-15", "2017-02-16", "2017-02-15", "2017-02-14", "2017-02-16", "2017-02-17", "2017-02-17", "2017-02-13"]; 
 

 
arr.sort(); 
 
console.log(arr);

+2

它看起來像格式良好的ISO日期給我, –

+0

請注意,Unicode代碼點並不適用於此,因爲所顯示的日期字符串中的所有字符均在ASCII範圍內(假設始終使用正常的「破折號」/ - ) sort()應該在這裏相當穩定。 – K3N

+0

@ K3N,在這種情況下。我想,我應該提到沒有回調和localeCompare的排序之間的區別。 –

2

既然你有日期字符串,它始終是更好地創建日期和檢查平等。

比較字符串可能有問題,因爲您可以有任何格式的日期。經典示例將是yyyy-m-d

在字符串比較中,2017-1-12大於2017-08-17

var arr = ["2017-02-17", "2017-02-17", "2017-02-16", "2017-02-15", "2017-02-16", "2017-02-15", "2017-02-14", "2017-02-16", "2017-02-17", "2017-02-17", "2017-02-7", "2017-02-13"]; 
 

 
arr.sort(function(a, b) { 
 
    var d1 = new Date(a); 
 
    var d2 = new Date(b); 
 
    return +d1 - +d2; 
 
}) 
 

 
console.log(arr)


注:正如指出的@K3N,如果輸入永遠是ISO格式,那麼你可以使用任何方式比較字符串(例如@Nina Scholz's answer)。但是,如果有可能接受任何其他格式的輸入,我建議比較日期對象。

+0

它們看起來是ISO格式的,應該很好地排序爲字符串(Array.sort()的默認值)。問題在於返回值應該是-1/0/1而不是布爾值。 – K3N

+0

是的,如果是這樣的話,但是如果採用ISO格式(yyyy-mm-dd)則日期爲2017-01-12並且不會導致任何問題。 – K3N

+1

@ K3N更新我的回答,並告知你。我仍然堅持我的方法,因爲這會幫助格式不一致的人。 :-) – Rajesh