它真的是一个排列铬的数组排序错误,即?

时间:2017-02-20 07:43:57

标签: javascript arrays google-chrome sorting

我创建了一个非常简单的数组排序脚本,它可以在Firefox上运行,但chrome和ie正在给我一个无序数组。

var arr = ["2017-02-17",
"2017-02-17",
"2017-02-16",
"2017-02-15",
"2017-02-16",
"2017-02-15",
"2017-02-14",
"2017-02-16",
"2017-02-17",
"2017-02-17",
"2017-02-13"];
arr.sort(function(a, b) {return a>b;});
console.log(arr);

是铬还是臭虫还是错过了什么?我几乎不相信chrome和ie differenrt js引擎有同样的问题。

3 个答案:

答案 0 :(得分:2)

您可以对Array#sort使用正确的比较,并将其用作返回值,而不是单个true / false,这样可以消除所需的负值。< / p>

如果您有ISO 6801个日期字符串,则可以使用String#localeCompare

&#13;
&#13;
var arr = ["2017-02-17", "2017-02-17", "2017-02-16", "2017-02-15", "2017-02-16", "2017-02-15", "2017-02-14", "2017-02-16", "2017-02-17", "2017-02-17", "2017-02-13"];

arr.sort(function(a, b) {
    return a.localeCompare(b);
});
console.log(arr);
&#13;
&#13;
&#13;

如果您不关心 Unicode代码点,可以使用Array#sort

  

sort()方法对数组中的元素进行排序并返回数组。排序不一定稳定。默认排序顺序是根据字符串Unicode代码点。

没有 compareFunction

&#13;
&#13;
var arr = ["2017-02-17", "2017-02-17", "2017-02-16", "2017-02-15", "2017-02-16", "2017-02-15", "2017-02-14", "2017-02-16", "2017-02-17", "2017-02-17", "2017-02-13"];

arr.sort();
console.log(arr);
&#13;
&#13;
&#13;

答案 1 :(得分:2)

由于日期为字符串,因此创建日期并检查相等性总是更好。

比较字符串可能会出现问题,因为您可以从任何格式获取日期。经典示例为yyyy-m-d

在字符串比较中,2017-1-12大于2017-08-17

var arr = ["2017-02-17", "2017-02-17", "2017-02-16", "2017-02-15", "2017-02-16", "2017-02-15", "2017-02-14", "2017-02-16", "2017-02-17", "2017-02-17", "2017-02-7", "2017-02-13"];

arr.sort(function(a, b) {
  var d1 = new Date(a);
  var d2 = new Date(b);
  return +d1 - +d2;
})

console.log(arr)

注意:正如@K3N所指出的,如果输入始终采用ISO格式,那么您可以使用任何方式进行字符串比较(例如@Nina Scholz's answer)。但如果有可能以任何其他格式接收输入,我建议改为比较日期对象。

答案 2 :(得分:1)

您必须使用简单排序而不传递callback函数。

arr.sort();

&#13;
&#13;
var arr = ["2017-02-17",
"2017-02-17",
"2017-02-16",
"2017-02-15",
"2017-02-16",
"2017-02-15",
"2017-02-14",
"2017-02-16",
"2017-02-17",
"2017-02-17",
"2017-02-13"];
arr.sort();
console.log(arr);
&#13;
&#13;
&#13;