1. ホーム
  2. javascript

JavaScriptにおけるsort関数の仕組みとcompare関数について

2023-08-27 23:39:39

質問

すでに質問されているように、JavaScriptではsort関数はどのように動作するのでしょうか? compare 関数とともにどのように機能するのでしょうか? もし私が配列を持っていて、それを array.sort(compare) を実行した場合、その配列はどうなるのでしょうか? compare 関数が a-b (配列の2つのインデックス)を返すと、その結果が0より大きいか、0より小さいか、0に等しいか、という事実に基づいて動作します。私はそれを動作させることができませんでした。

どのように解決するのですか?

関数 "compare" は2つの引数を取る必要があり、しばしば次のように呼ばれます。 a b . そして、これらの値に基づいて比較関数が0、0より大きい、または0より小さい値を返すようにするのです。 a b .

  1. 以下の場合、0より大きい値を返します。 a よりも大きい場合 b
  2. 0 を返します。 a と等しい場合 b
  3. 0 より小さい値を返します。 a よりも小さい場合 b

これら3つの戻り値と2つの引数だけで、どんな入力データ型や複雑なデータ構造でもソートできる比較関数を書くことができるのです。

そして、独自の比較関数でsort()を呼び出すと、比較関数はソートされるリストのペアに対して呼び出され、適切な順序を決定することができます。

簡単な例を見てみましょう。数字を並べ替えるだけなので、非常に単純な比較関数があります。

function compare(a,b) {
    return a - b;
}

aからbを引くだけで、aがbより大きければ0より大きい値を、等しければ0を、aがbより小さければ0より小さい値を必ず返すので、比較関数としての要件を満たしています。

さて、これがソートする数値のリストだとしましょう。

var numbers = [1,5,3.14];

を呼び出すと numbers.sort(compare) を呼び出すと、内部的には実際に実行されます。

compare(1,5);     // Returns -4, a is less than b
compare(1,3.14);  // Return -2.14, a is less than b
compare(5,3.14);  // returns 1.86, a is greater than b

手作業で並べ替えやアルファベット順の変更を行ったことがある人は、おそらく気づかないうちに、まったく同じことを行っているはずです。 比較する項目が何十、何百もあるにもかかわらず、常に一度に 2 つの数字 (または著者の姓など) のみを比較しているのです。 3 つの数字の短いリストをもう一度見てみると、最初の 2 つの数字を比較することから始めるでしょう。

  1. 1 は 5 より大きいですか、小さいですか? より小さいので、これらの 2 つの数字をリストに入れます。1,5
  2. 3.14 は 1 よりも大きいですか、小さいですか? より大きいので、新しいリストでは 1 の後になります。
  3. 3.14 は新しいリストの 5 よりも大きいですか、小さいですか? より小さいので、5 より前になります。 新しいリストは、現在 [1,3.14,5] です。

compare()関数を独自に用意できるので、数値だけでなく、任意の複雑なデータをソートすることが可能です。