ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript の並べ替え比較関数でブール値の戻り値が予期しない結果を引き起こすのはなぜですか?

JavaScript の並べ替え比較関数でブール値の戻り値が予期しない結果を引き起こすのはなぜですか?

Susan Sarandon
リリース: 2024-12-16 19:09:21
オリジナル
266 人が閲覧しました

Why Do Boolean Return Values Cause Unexpected Results in JavaScript's Sort Comparison Functions?

JavaScript での並べ替え: 比較関数でのブール値の戻り値

問題

一般的な慣行にもかかわらず、ブール値 (true または false) を返すJavaScript での並べ替えに使用される比較関数が正しくないため、予期しない結果が生じる可能性があります

理由

並べ替えアルゴリズムは、比較関数が数値を返すことを期待します。特に:

  • 最初の引数が必要な場合は 正の数値 2 つの引数が考慮される場合、2 番目の
  • 0 の後にソートされる等しい
  • 最初の引数を 2 番目の引数より前に並べ替える必要がある場合は 負の数

ブール値を返します (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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート