一般的な慣行にもかかわらず、ブール値 (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 中国語 Web サイトの他の関連記事を参照してください。