有人可以解释这是Chrome中的错误还是我错误地比较了字符串?
Chrome中的排序方法提供奇数(至少对我而言)结果。 我做了以下事情:
var a = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c"]
a.sort((i1,i2)=>i1>i2)
["7", "c", "b", "a", "9", "8", "6", "5", "4", "3", "2", "1"]
Firefox给出了预期的结果:
["c", "b", "a", "9", "8", "7", "6", "5", "4", "3","2","1"]
答案 0 :(得分:5)
这是sort
回调中的错误,而不是JavaScript引擎。
回调必须返回数字,而不是布尔值:
0
如果参数相同<0
如果第一个参数是“小于”第二个>0
如果第二个参数是“小于”第一个 localeCompare
可以方便地获取正确的返回值。但是,在你的情况下,你想要相反,所以否定它:
var a = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c"]
a.sort((i1, i2) => -i1.localeCompare(i2));
console.log(a);
...或(doh)只改为i2.localeCompare(i1)
。
答案 1 :(得分:2)
您的排序比较器功能不符合合同。如果第一个参数应在第二个参数之前排序,则排序比较器应返回负数,如果第二个参数应在第一个参数之前排序,则返回正数;如果参数已经按可接受的顺序排序,则返回0。
您的函数返回一个布尔值,它将被解释为0
或1
。这意味着当排序操作以不同的顺序使用相同的两个值调用它时,该函数可能会返回冲突的结果。
考虑列表中的两个值,“a”和“b”。如果排序操作像这样调用你的回调:
var ordering = yourCallback("a", "b"); // not really how it looks of course
然后你的回调将返回0
,并且sort函数将把它解释为意味着这两个值已经按顺序排列。如果它稍后调用函数 this :
var ordering = yourCallback("b", "a");
它将获得1
。这与相同两个参数的第一个结果不一致。
该语言的规范没有规定用于.sort()
的实现的算法,Firefox和Chrome中的JavaScript运行时在它们如何响应异常排序比较器功能的细节上肯定是不同的