我想知道为什么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将位于结果数组的尾部.