首页 >web前端 >js教程 >为什么在 JavaScript 数组排序比较函数中返回布尔值是错误的:正确使用指南?

为什么在 JavaScript 数组排序比较函数中返回布尔值是错误的:正确使用指南?

Susan Sarandon
Susan Sarandon原创
2024-12-19 10:43:11217浏览

Why Returning Booleans in JavaScript Array Sort Comparison Functions is Wrong: A Guide to Correct Usage?

JavaScript 中用于数组排序的自定义比较函数:当布尔返回值不够时

虽然自定义比较函数通常用于修改数组的默认字典顺序,一个常见的误解是简单地从函数返回 true 或 false 就足够了。但是,这种方法是不正确的,可能会导致排序结果不可靠。

布尔比较函数的问题

从比较函数返回布尔值的问题是它可能违反 JavaScript 规范中定义的“一致比较函数”的要求。一致的比较函数必须返回一个数字(特别是 -1、0 或 1),指示比较元素的相对顺序。

返回布尔值而不是数字可能会导致意外行为:

  • 传递性违规: 函数 function(a, b) { return a >;乙;当 b 大于 a 时返回 false,这意味着 b 应该排在 a 之前。然而,当 a 和 b 相等时,该函数也会返回 false,这与传递属性相矛盾,即如果 a 等于 b 并且 b 小于 c,则 a 必须小于 c。
  • 未定义的排序顺序: 从比较函数返回 false 可能会导致未定义的排序顺序。例如,排序 [1, 1, 0, 2].sort(function(a, b) { return a > b; }) 可能会导致 [0, 1, 1, 2] 或 [1, 1, 0, 2] 取决于排序算法的实现。

正确比较函数

为了确保排序一致且可靠,定义比较函数至关重要,该函数返回一个表示比较元素相对顺序的数字:

  • 通用比较函数: 对于字典序比较,通用函数可以定义为 function(a, b) { if (a b) 返回 1;否则返回0; }.
  • 数字比较:为了比较数字,可以使用更简单的函数: function(a, b) { return a - b; }.
  • 按特定属性进行比较:要按特定属性对对象或数组进行排序,函数可以访问该属性并比较其值: function(a, b) { return a. name.localeCompare(b.name); } 用于按对象名称排序。

结论

虽然在 JavaScript 中使用布尔值返回比较函数可能很诱人,但遵循一致比较函数的指定要求至关重要。这确保排序算法可以正确比较元素并产生可靠且可预测的结果。

以上是为什么在 JavaScript 数组排序比较函数中返回布尔值是错误的:正确使用指南?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn