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中文網其他相關文章!