【问题标题】:Lo-Dash sortBy array of dates in string formatLo-Dash sortBy 字符串格式的日期数组
【发布时间】:2014-11-14 13:05:51
【问题描述】:

我想知道为什么 lodash 与普通的 javascript sort() 相比,不以字符串格式对日期数组进行排序。这是预期的行为还是错误?

var array = ["2014-11-11", "2014-11-12", null, "2014-11-01", null, null, "2014-11-05"];

_.sortBy(array);
// ["2014-11-11", "2014-11-12", null, "2014-11-01", null, null, "2014-11-05"]

_.sortBy(array, function(value) {return new Date(value);});
// [null, null, null, "2014-11-01", "2014-11-05", "2014-11-11", "2014-11-12"]

array.sort();
// ["2014-11-01", "2014-11-05", "2014-11-11", "2014-11-12", null, null, null]

使用的版本:Lo-Dash v2.4.1 - 现代版本。

【问题讨论】:

    标签: javascript sorting lodash


    【解决方案1】:

    如果您查看 lodash 代码,您可能会看到它是如何实现的。函数_.sortBy 内部使用本机Array.prototype.sort(参见source)。但根本不存在。更有趣的是函数compareAscending,它作为回调传递给原生sort (source)。所以用几句话你的

    _.sortBy(array, function(value) {return new Date(value);});

    转换为:

    array.sort(function(a, b) {
        var aa = new Date(a),
            bb = new Date(b);
    
        if (aa !== bb) {
            if (aa > bb) { return 1; }
            if (aa < bb) { return -1; }
        }
        return aa - bb;
    })
    

    那么为什么nulls 在开头呢?因为new Date(null) 返回的Thu Jan 01 1970 01:00:00 小于数组中的任何其他日期。

    原生sort呢?根据规范(请参阅here默认排序顺序是根据字符串 Unicode 代码点。 如果简单的话 - 原生 sort 将项目转换为字符串并比较字符串。所以原生排序就像:

    _.sortBy(array, function(value) {return value + ''; });
    

    只要 'null' 字符串总是比日期字符串“大”(如 '2014-11-11')-nulls 将位于结果数组的尾部。

    【讨论】:

    • 你也可以使用_.sortBy(array, String),它使用String作为一个函数,也将一个给定的值强制转换为一个字符串,就像+''一样。
    【解决方案2】:

    如果您尝试使用 lodash 为对象数组按升序或降序对日期进行排序,则应使用 _.orderBy 而不是 _.sortBy

    https://lodash.com/docs/4.17.15#orderBy,此方法允许通过'asc''desc' 指定排序顺序

    一个例子是:

    const sortedArray = _(myArray.orderBy([
      function(object) {
        return new Date(object.date);
      }],["desc"])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2014-04-26
      • 2016-12-06
      • 1970-01-01
      相关资源
      最近更新 更多