首頁 >web前端 >js教程 >為什麼布林回傳值會在 JavaScript 的排序比較函數中導致意外結果?

為什麼布林回傳值會在 JavaScript 的排序比較函數中導致意外結果?

Susan Sarandon
Susan Sarandon原創
2024-12-16 19:09:21275瀏覽

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