gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:32:11 24 4
gpt4 key购买 nike

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

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 – 现代构建。

最佳答案

如果您查看 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;
})

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

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

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

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

关于javascript - Lo-Dash sortBy 字符串格式的日期数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26930692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com