2013-09-25 38 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();}