下划线排序

时间:2014-10-06 21:13:00

标签: sorting underscore.js

 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"}];

1 个答案:

答案 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();
});