我想知道为什么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 举报,一经查实,本站将立刻删除。