首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lo-字符串格式的日期的破折号sortBy数组

Lo-字符串格式的日期的破折号sortBy数组
EN

Stack Overflow用户
提问于 2014-11-14 21:05:52
回答 2查看 35.4K关注 0票数 13

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

代码语言:javascript
复制
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 -现代版本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-15 01:25:18

如果你看一看lodash代码,你可能会发现它是如何实现的。内部的_.sortBy函数使用原生Array.prototype.sort (请参阅source)。但是根并不在那里。更有趣的是作为回调传递给本机sort (source)的函数compareAscending。所以简而言之,你的

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

转换为:

代码语言:javascript
复制
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呢?根据spec (请参阅here) ,默认的排序顺序是根据string Unicode代码点。如果是简单原生sort,则将项转换为字符串并比较字符串。所以原生排序就像这样:

代码语言:javascript
复制
_.sortBy(array, function(value) {return value + ''; });

只要'null‘字符串总是“大于”日期字符串(如'2014-11-11') - nulls就会出现在结果数组的尾部。

票数 25
EN

Stack Overflow用户

发布于 2019-11-21 20:24:51

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

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

下面是一个例子:

代码语言:javascript
复制
const sortedArray = _(myArray.orderBy([
  function(object) {
    return new Date(object.date);
  }],["desc"])
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26930692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档