2014-10-06 89 views
0
var array = [{"id":"0", "stopDate":null}, 
       {"id":"1", "stopDate":"10/06/2014"}, 
       {"id":"2", "stopDate":null}, 
       {"id":"3", "stopDate":"09/06/2014"}]; 

我有上面的对象数组,并且希望使用下划线按停止日期进行排序。我正在使用以下功能来做到这一点。下划线排列

_.sortBy(array, "stopDate"); // asc 
_.sortBy(array, "stopDate").reverse(); //desc 

上述方法正确地对日期值进行排序,但忽略空值。所以asc的输出是

var actual= [{"id":"0", "stopDate":null}, 
       {"id":"3", "stopDate":"09/06/2014"}, 
       {"id":"2", "stopDate":null}, 
       {"id":"1", "stopDate":"10/06/2014"}]; 

但我期待null分组在一起,应该出现一个接一个。

var expected= [{"id":"0", "stopDate":null}, 
       {"id":"2", "stopDate":null}, 
       {"id":"3","stopDate":"09/06/2014" }, 
       {"id":"1", "stopDate":"10/06/2014"}]; 
+0

当我跑到你的代码我得到了“期望”输出,即0,2,3,1。 – 2014-10-06 21:21:50

+0

这些'stopDate'值是字符串还是日期?如果它们是字符串,那么您应该将它们重新格式化为ISO 8601格式,以便它们可以正确比较。 – 2014-10-06 21:46:53

+0

@Jordan:纯粹的运气,由你的浏览器的排序实现引起的:-) – Bergi 2014-10-06 21:49:00

回答

2

以上方法排序日期值正确

不是真的。对DD/MM/YYYY格式的词汇比较几乎不会返回预期结果。

但忽略 “ - ”

有在你的对象没有"--"值,也仅为null值。并且由于null的值不是比(非数字)字符串(您可以在控制台中尝试,它始终会产生false)更大也不小于,因此它们被认为是相等的 - 但这会产生inconsistent comparison

你应该做的,而不是为分析那些日期字符串到适合地可比时间戳,以及null值插入到一-Infinity+Infinity使他们与时间戳比较预期:

_.sortBy(array, function(d) { 
    if (d.stopDate == null) return -Infinity; 
    var parts = d.stopDate.split("/"); 
    return (new Date(+parts[2], parts[1]-1, +parts[0])).getTime(); 
});