Lo-Dash sortBy字符串格式的日期数组

时间:2014-11-14 13:05:52

标签: javascript sorting lodash

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

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 - 现代版本。

2 个答案:

答案 0 :(得分:22)

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

_.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;
})

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

原生sort怎么样?根据规范(参见here默认排序顺序是根据字符串Unicode代码点。如果简单 - 本机sort将项目转换为字符串并比较字符串。所以本地排序就像:

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

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

答案 1 :(得分:0)

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

https://lodash.com/docs/4.17.15#orderBy,此方法允许按_.sortBy'asc'

指定排序顺序

一个例子是:

'desc'