微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我想知道为什么lodash不排序字符串格式的日期数组与纯 JavaScript排序()相比.是预期的行为还是一个错误
array = ["2014-11-11","2014-11-12",null,"2014-11-01","2014-11-05"]

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

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

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

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

解决方法

如果你看看放弃代码,你可能会看到它的实现.函数_.sortBy里面使用本机Array.prototype.sort(见 source).但根本不在那里.更有意思的是作为回调传递给native sort( source)的函数compareAscending.所以用几句话你的

_.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在开始?因为新的Date(null)返回到1970年01月01日01:00:00,它比数组中的任何其他日期少.

本土排序怎么样?根据spec(参见here)认排序顺序是根据字符串Unicode代码点.如果简单 – 本机排序将项目转换为字符串并比较字符串.所以本地排序是如此:

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

一旦’null’字符串始终比日期字符串“更大”(如“2014-11-11”) – null将位于结果数组的尾部.

原文地址:https://www.jb51.cc/js/151522.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐