Javascript排序不一致

时间:2013-09-25 13:57:18

标签: javascript json sorting

我对此感到困惑。我在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/

有什么想法吗?

5 个答案:

答案 0 :(得分: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/

答案 1 :(得分: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/

答案 2 :(得分:1)

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

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

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


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


<强>最后

事实证明FireFox / Safari Date()不喜欢表单“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。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:-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/