2014-02-16 113 views
-1

我有一个数组是这样的:问题比较ISODates

var a = [ 
    { 
     "date": "2014-02-06T13:40:09.475Z", 
     "foo": "0" 
    }, 
    ... 
    { 
     "date": "2014-02-14T10:35:25.862Z", 
     "foo": "19" 
    } 
]; 

我想按日期排序。 date字段是字符串化的ISODate。这个数组正在按这种方式排序:

a.sort(function (f1, f2) { 
    return new Date(f1.date) > new Date(f2.date); 
}); 

问题是数组未按预期排序。

的的Pusing在日期排列o

var o = []; 
for (var i = 0; i < a.length; ++i) { 
    o.push((new Date(a[i].date)).toString()); 
} 

o包含:

[ 
    // Isn't this supposed to be near the other days? 
    "Tue Feb 04 2014 16:37:39 GMT+0200 (EET)", // | 
    "Thu Feb 06 2014 15:40:09 GMT+0200 (EET)", // | 
    "Thu Feb 06 2014 10:39:08 GMT+0200 (EET)", // | 
    "Wed Feb 05 2014 16:07:50 GMT+0200 (EET)", // | 
    "Tue Feb 04 2014 16:38:56 GMT+0200 (EET)", // <-/ 
    "Tue Feb 04 2014 16:54:11 GMT+0200 (EET)", 
    "Tue Feb 04 2014 16:52:45 GMT+0200 (EET)", 
    "Tue Feb 11 2014 14:34:29 GMT+0200 (EET)", 
    "Thu Feb 06 2014 17:14:11 GMT+0200 (EET)", 
    "Tue Feb 11 2014 14:34:35 GMT+0200 (EET)", 
    "Fri Feb 07 2014 11:44:46 GMT+0200 (EET)", 
    "Thu Feb 06 2014 17:33:33 GMT+0200 (EET)", 
    "Fri Feb 07 2014 15:20:15 GMT+0200 (EET)", 
    "Tue Feb 11 2014 11:59:24 GMT+0200 (EET)", 
    "Tue Feb 11 2014 12:38:11 GMT+0200 (EET)", 
    "Tue Feb 11 2014 14:54:07 GMT+0200 (EET)", 
    "Tue Feb 11 2014 14:54:24 GMT+0200 (EET)", 
    "Wed Feb 12 2014 17:21:28 GMT+0200 (EET)", 
    "Thu Feb 13 2014 15:42:15 GMT+0200 (EET)", 
    "Fri Feb 14 2014 12:35:25 GMT+0200 (EET)" 
] 

而且还有其他奇怪的事情,因为你看到的。这个问题怎么解决?在服务器端,这些文档来自MongoDB数据库,但它们的排序方式相同。

我创建了一个演示此问题的JSFIDDLE。问题是哪个?

回答

1

sort()要求返回值是一个正数或一个负数(而不是0),除非它们意味着相等(即当你使用0时) - 如果你的布尔测试返回false,它被视为相等(而不是较低),因为+false === 0。你应该这样做:

a.sort(function (f1, f2) { 
    return new Date(f1.date) > new Date(f2.date) ? 1 : -1; 
}); 

查看更新的JSFiddle here

+0

我认为它会自动转换布尔值。好答案! –

+0

没有理由将它们转换为“日期”。你可以做一个字符串的比较。 'return f1.date> f2.date? 1:-1;' – WiredPrairie

+0

@WiredPrairie:true,除非时区不同。 –