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将位于结果数组的尾部.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...