JavaScriptにおけるsort関数の仕組みとcompare関数について
質問
すでに質問されているように、JavaScriptではsort関数はどのように動作するのでしょうか?
compare
関数とともにどのように機能するのでしょうか?
もし私が配列を持っていて、それを
array.sort(compare)
を実行した場合、その配列はどうなるのでしょうか?
compare
関数が
a-b
(配列の2つのインデックス)を返すと、その結果が0より大きいか、0より小さいか、0に等しいか、という事実に基づいて動作します。私はそれを動作させることができませんでした。
どのように解決するのですか?
関数 "compare" は2つの引数を取る必要があり、しばしば次のように呼ばれます。 a と b . そして、これらの値に基づいて比較関数が0、0より大きい、または0より小さい値を返すようにするのです。 a と b .
- 以下の場合、0より大きい値を返します。 a よりも大きい場合 b
- 0 を返します。 a と等しい場合 b
- 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 は 5 より大きいですか、小さいですか? より小さいので、これらの 2 つの数字をリストに入れます。1,5
- 3.14 は 1 よりも大きいですか、小さいですか? より大きいので、新しいリストでは 1 の後になります。
- 3.14 は新しいリストの 5 よりも大きいですか、小さいですか? より小さいので、5 より前になります。 新しいリストは、現在 [1,3.14,5] です。
compare()関数を独自に用意できるので、数値だけでなく、任意の複雑なデータをソートすることが可能です。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] JavaScriptで現在のURLを取得する?
-
[解決済み] JavaScriptで2つの日付を比較する
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み] JavaScriptを使用してHTML要素に属性を追加/更新するには?
-
[解決済み] V8 Javascript エンジンのスタンドアロン実行
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Javascriptで元の配列を変更せずに配列を逆順にする。
-
[解決済み] JSのDateからDay名
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] TypeScriptのdeclare classとinterfaceの違いとは?
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] React js 親コンポーネントから子コンポーネントの状態を変更する
-
[解決済み] 無効になっている入力フィールドの値を送信する
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] V8 Javascript エンジンのスタンドアロン実行
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる