【问题标题】:Underscore sortBy下划线排序依据
【发布时间】:2014-10-07 12:20:13
【问题描述】:
 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

Above 方法对日期值进行了正确排序,但忽略了 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、3、1。
  • 那些stopDate 值是字符串还是日期?如果它们是字符串,那么您真的应该将它们重新格式化为 ISO 8601 格式,以便它们正确比较。
  • @Jordan:运气不错,是浏览器的排序实现造成的 :-)
  • @Bergi 实际上是因为原始问题不同(OP 有 "--" 而不是 null)。

标签: sorting underscore.js


【解决方案1】:

以上方法正确排序日期值

不是真的。对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();
});

【讨论】:

    猜你喜欢
    • 2015-10-24
    • 2013-09-23
    • 1970-01-01
    • 2010-11-23
    • 2018-01-04
    • 1970-01-01
    • 2023-04-04
    • 2015-11-19
    相关资源
    最近更新 更多