JavaScript 逆引き集 | 配列のソート(数値)

JavaScript JavaScript
スポンサーリンク

配列の数値ソートの基本イメージ

arr.sort((a, b) => a – b) は、「配列を数値として正しく昇順に並べるための書き方」です。 JavaScript の sort() はそのまま使うと 文字列として比較するクセがあるため、数値を扱うときは必ず比較関数を渡す必要があります。

この比較関数こそが、初心者が最初につまずくポイントなので、ここを徹底的にかみ砕いて説明します。

なぜ比較関数が必要なのか(JavaScript の“文字列ソート問題”)

JavaScript の sort() は、何も指定しないと 文字列として比較します。

const arr = [10, 2, 5];
arr.sort();
console.log(arr); // ["10", "2", "5"] を辞書順で比較する
JavaScript

辞書順とは、「1」「2」「5」のように文字として見たときの順番です。 そのため、数値として期待する「2, 5, 10」にはなりません。

ここで必要なのが、数値として比較するための関数です。

比較関数 (a, b) => a - b の意味を深掘りする

sort に渡す関数は、 「a と b を比べて、どちらを前に置くべきか」を決める役割を持ちます。

JavaScript のルールはこうです。

  • 戻り値が 負の数 → a を b より前に置く
  • 戻り値が 正の数 → a を b より後ろに置く
  • 戻り値が 0 → 順番はそのまま

ここで (a, b) => a - b を使うと、 小さい数ほど前に、大きい数ほど後ろに並ぶようになります。

例で見ると分かりやすいです。

// a = 2, b = 5
a - b = -3   → 負 → 2 を前に

// a = 10, b = 2
a - b = 8    → 正 → 10 を後ろに
JavaScript

この仕組みによって、昇順ソートが成立します。

昇順ソートの例

const arr = [10, 2, 5, 1];
arr.sort((a, b) => a - b);
console.log(arr); // [1, 2, 5, 10]
JavaScript

内部では、要素同士を何度も比較しながら、 「小さい → 大きい」の順に並べ替えています。

降順ソートとの違い

昇順は a - b。 降順は比較を逆にして b - a

const arr = [10, 2, 5, 1];
arr.sort((a, b) => b - a);
console.log(arr); // [10, 5, 2, 1]
JavaScript

覚えるべきことはとてもシンプルです。

  • 昇順 → a – b
  • 降順 → b – a

この2つだけで、数値ソートはほぼ制覇できます。

sort の重要な性質:元の配列を書き換える

sort破壊的メソッドです。 つまり、元の配列そのものを並べ替えます。

const arr = [10, 2, 5];
const r = arr.sort((a, b) => a - b);

console.log(arr); // [2, 5, 10]
console.log(r);   // [2, 5, 10](同じ配列)
JavaScript

元の順番を残したい場合は、コピーしてからソートします。

const arr = [10, 2, 5];
const sorted = [...arr].sort((a, b) => a - b);

console.log(arr);    // [10, 2, 5]
console.log(sorted); // [2, 5, 10]
JavaScript

スプレッド構文との組み合わせは、現場でもよく使われる安全な書き方です。

オブジェクト配列を数値でソートする応用例

数値ソートの考え方は、オブジェクト配列にもそのまま使えます。

const users = [
  { name: "Aki", score: 80 },
  { name: "Mika", score: 95 },
  { name: "Ken", score: 70 }
];

users.sort((a, b) => a.score - b.score);

console.log(users);
/*
[
  { name: "Ken",  score: 70 },
  { name: "Aki",  score: 80 },
  { name: "Mika", score: 95 }
]
*/
JavaScript

ここでは、

  • 比較対象を「要素そのもの」ではなく「score プロパティ」にする
  • a.score - b.score で昇順に並べる

という形になっています。

「どの数値を基準に並べたいか」を比較関数で指定する これがオブジェクトソートの本質です。

まとめ:(a, b) => a - b は数値ソートの“合言葉”

数値を正しく並べたいなら、 arr.sort((a, b) => a – b) をそのまま覚えてしまって構いません。

  • JavaScript は比較関数なしだと文字列として並べる
  • 数値ソートには必ず (a, b) => a - b
  • 降順は (b, a) => b - a
  • sort は元の配列を書き換えるので注意
  • 必要ならコピーしてからソートする

このポイントを押さえるだけで、 あなたの配列操作は一気にプロレベルに近づきます。

タイトルとURLをコピーしました