我正在使用像这样的排序算法
top.sort(function(a,b){ return b > a});
我预计数组会按降序排序。它适用于top = [1,2,3,4,5,6,7,8,9,10]
但是top = [1,2,3,4,5,6,7,8,9,10,11]
我得到了一个意想不到的结果
[6, 11, 10, 9, 8, 7, 5, 4, 3, 2, 1]
我发现我使用了排序功能错误。我应该用
top.sort(function(a,b){ return b - a});
现在有什么区别?为什么顶部的不能像我预期的那样工作(但是数组长度小于11?
答案 0 :(得分:4)
sort函数回调需要三个可能的返回值:
小于0
0
大于0
告诉它两个值是相同还是更大。您的单一比较仅返回true
或false
,这些广告将投放到1
或0
,这些信息不足以正确评估哪一个更大。它可以在b
大于a
时有效,但在false
大于0
时会返回a
(可能会被解释为b
)这会错误地告诉排序算法这两个值是相等的。
另一方面,
return b - a
正确地为b
和a
的所有可能数值提供所有三个返回值,因此它可以正常工作。如果您的值不是数字,那么您将不得不更明确地编写将返回三种类型的返回值的比较。返回减法的结果恰好符合排序回调标准。它当然不是编写比较函数的唯一方法。
实际上,如果要对字符串数组进行排序,可以使用不同类型的比较,这种比较也会被编码以返回三种类型的返回值:
var result = ["hello", "goodbye", "adios"].sort(function(a, b) {
return a.localeCompare(b);
});
document.write(JSON.stringify(result));