我对此感到困惑。我在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
但是,当我使用更长的数组时,排序不起作用。只需看看第二种类型的前三个对象:
有什么想法吗?
答案 0 :(得分:3)
您的比较器需要返回一个数字,而不是布尔值。
负数如果小于,0
如果相等,则为正数,如果大于。
.sort(function(a,b) {
if(a.ts == b.ts) return 0;
return a.ts < b.ts ? -1 : 1;
});
答案 1 :(得分:3)
尝试更改排序功能:
.sort(function(a,b) {
if(a.ts < b.ts) return -1;
else if(a.ts > b.ts) return 1;
return 0;
});
答案 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/ 答案 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;
});