首页 >web前端 >js教程 >为什么布尔返回值会在 JavaScript 的排序比较函数中导致意外结果?

为什么布尔返回值会在 JavaScript 的排序比较函数中导致意外结果?

Susan Sarandon
Susan Sarandon原创
2024-12-16 19:09:21267浏览

Why Do Boolean Return Values Cause Unexpected Results in JavaScript's Sort Comparison Functions?

JavaScript 中的排序:比较函数中的布尔返回值

问题

尽管有常见的做法,但在比较函数中返回布尔值(true 或 false) JavaScript 中用于排序的比较函数不正确,可能会导致意外结果。

原因

排序算法期望比较函数返回数字,具体来说:

  • A 正数如果第一个参数应在第二个参数之后排序
  • 0 如果两个参数被认为相等
  • A 负数 如果第一个参数应在第二个参数之前排序

返回布尔值(false 等于 0,true 等于 1)不符合一致比较函数的传递性要求。此要求确保排序算法可以根据之前的比较来推断元素的顺序。

令人惊讶的演示

考虑比较函数:

function compare(a, b) {
    return a > b;
}

这个当“a”大于“b”时,函数返回 true(或 1),但即使在以下情况下也会错误地返回 false(或 0) “b”大于“a”。因此,排序算法将 'a' 和 'b' 视为相等,导致排序顺序不可预测。

反例

尽管通过了一些基本测试,但上述比较函数在某些情况下会失败,如:

[0, 1, 0].sort(compare);  // Result: [0, 1, 0] (expected: [0, 0, 1])
[1, 1, 0, 2].sort(compare);  // Result: [0, 1, 2, 1] (expected: [0, 1, 1, 2])

正确的比较函数

用于字典排序(升序),不使用比较函数,因为元素将自动转换为字符串进行比较。

对于数字排序,使用:

function compareNumbers(a, b) {
    return a - b;
}

对于更复杂的比较,使用条件语句返回适当的数字:

function compareObjects(a, b) {
    if (a.property > b.property) return 1;
    if (a.property < b.property) return -1;
    return 0;
}

以上是为什么布尔返回值会在 JavaScript 的排序比较函数中导致意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

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