尽管有常见的做法,但在比较函数中返回布尔值(true 或 false) JavaScript 中用于排序的比较函数不正确,可能会导致意外结果。
排序算法期望比较函数返回数字,具体来说:
返回布尔值(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中文网其他相关文章!