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
上面的方法正确排序日期值但忽略null。所以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 :(得分:2)
上述方法正确排序日期值
不是真的。格式为DD/MM/YYYY
的词法字符串比较几乎不会返回预期的结果。
但忽略" - "
对象中没有"--"
个值,只有null
个值。由于null
值既不大于也不小于(非数字)字符串(您可以在控制台中尝试,它总是产生false
),它们被视为相等 - 然而,它会产生inconsistent comparison。
您应该做的是将这些日期字符串解析为正确可比的时间戳,并将null
值解析为-Infinity
或+Infinity
,以便它们与预期的时间戳进行比较:< / p>
_.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();
});