儘管有常見的做法,但在比較函數中返回布爾值(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中文網其他相關文章!