2013-09-25 35 views
4

我對此感到困惑。我在Js做了很多排序,但出於某種原因,我得到了奇怪的行爲。Javascript排序不一致

x = [{ts: "2013-09-24 14:44:22"}, {ts: "2013-09-24 14:08:26"}, {ts: "2013-09-24 17:37:42"}].sort(function(a,b) {return a.ts < b.ts;}); 
console.log(x); // this is sorted 

但是,當我使用更長的數組時,排序不起作用。試想一下,在第二次排序的前三個對象:

http://jsfiddle.net/HWx7p/

任何想法?

+0

嗯...'sort'修改原始數組,並返回一個布爾值... –

+0

它看起來排序的給我。 – Andy

+0

執行此操作:'.sort(function(a,b){return b.ts.localeCompare(a.ts);});' – user2736012

回答

3

您的比較器需要返回一個數字,而不是布爾值。

負數小於,0如果相等,則爲正數,如果大於。

.sort(function(a,b) { 
    if(a.ts == b.ts) return 0; 
    return a.ts < b.ts ? -1 : 1; 
}); 

http://jsfiddle.net/HWx7p/8/

-2

你比較字符串...沒有時間戳;)

y = y.sort(function(a,b) { 
    var ta = (+new Date(a.ts)); 
    var tb = (+new Date(b.ts)); 
    if (ta < tb) 
     return -1; 
    if (ta > tb) 
     return 1; 
    return 0; 
}); 

這裏: http://jsfiddle.net/HWx7p/

+1

該格式的日期可排序爲字符串。 –

+0

當然不是交叉兼容的... –

+0

我不知道你的意思是交叉兼容,但看看字符串。這是一個字符串可排序的日期格式。如果您將這些字符串作爲字符串排序,它們將按日期順序排序。總是。 –

1

排序它日期,這是你想要什麼:

y.sort(function(a,b) { 
    return new Date(a.ts) < new Date(b.ts); 
}); 

分叉的小提琴http://jsfiddle.net/bHh4g/


在撥弄已意外刪除console.log(y);,但重新插入它會顯示它現在排序正確。


最後

原來火狐/ Safari瀏覽器Date()犯規等形式 「2013-09-24 14:44:22」 他們需要的是開日期/ M/D來代替:

y.sort(function(a,b) { 
    var d1 = a.ts.replace(/-/g,'/'); 
    var d2 = b.ts.replace(/-/g,'/'); 
    d1 = new Date(d1); 
    d2 = new Date(d2); 
    return (d1 < d2) ? -1 : (d1 > d2) ? 1 : 0; 
}); 

console.log(y); 

分叉的小提琴http://jsfiddle.net/Jnx4w/
適用於Chrome/FF。

+0

因此,我再次測試它,並像以前一樣,它不能正確排序,至少在Safari中,[見](http://jsfiddle.net/z3QGg/)。我也想知道,這是通過簡單的字符串比較產生的開銷。 – insertusernamehere

0

有兩件事:你的排序函數應該返回一個帶符號的數字,而不是布爾值,它看起來像你想比較日期而不是字符串。

爲了您的排序功能,嘗試:

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