4

我对此感到困惑。我在 Js 中做了很多排序,但由于某种原因,我的行为很奇怪。

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/

有任何想法吗?

4

5 回答 5

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/

于 2013-09-25T14:03:18.563 回答
3

尝试更改您的排序功能:

.sort(function(a,b) {

    if(a.ts < b.ts) return -1;
    else if(a.ts > b.ts) return 1;
    return 0;

});

演示:http: //jsfiddle.net/maniator/HWx7p/6/

于 2013-09-25T14:03:25.130 回答
1

将其排序为日期,这就是您想要的:

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

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


在小提琴中意外删除console.log(y);,但重新插入它将显示它现在排序正确。


最后

事实证明,FireFox / SafariDate()不喜欢“”形式的日期,2013-09-24 14:44:22而是需要 y/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。

于 2013-09-25T14:08:10.807 回答
0

两件事:你的排序函数应该返回一个有符号的数字,而不是一个布尔值,看起来你想要比较日期,而不是字符串。

对于您的排序功能,请尝试:

function(a,b){ return (new Date(a)).getTime() - (new Date(b)).getTime();}
于 2013-09-25T14:10:35.557 回答
-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/

于 2013-09-25T14:06:55.550 回答