JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptでsort()を使わずにreduce()だけで配列を並べ替える方法

JavaScriptでは通常、配列の並べ替えにはArray.prototype.sort()メソッドを使います。しかし、学習目的や特定の要件がある場合など、sort()を使用せずに配列をソートしたいケースもあります。

本記事では、Array.prototype.reduce()メソッドを活用して、数値の配列を並べ替える関数を実装します。考え方は「挿入ソート」に近く、元の配列から要素を1つずつ取り出しながら、累積結果(アキュムレータ)の中で正しい位置へ挿入していくというものです。

実装例

それでは、実際のコードを見てみましょう。

const arr = [4, 56, 5, 3, 34, 37, 89, 57, 98];

const sortWithReduce = arr => {
  return arr.reduce((acc, val) => {
    // 挿入すべき位置を決める
    let ind = 0;
    while (ind < acc.length && val > acc[ind]) {
      ind++;
    }
    // 決定した位置に要素を挿入
    acc.splice(ind, 0, val);
    return acc;
  }, []);
};

console.log(sortWithReduce(arr));

出力結果

コンソールには次のように表示されます。

[
   3,  4,  5, 34, 37,
  56, 57, 89, 98
]

コードの解説

この実装が動作する仕組みは以下のとおりです。

  • 初期値として空の配列を用意 … reduce()の第2引数に空配列[]を渡し、これがアキュムレータ(acc)の出発点になります。
  • 要素を1つずつ取り出す … 元の配列から先頭の要素から順に値(val)を取り出します。
  • 挿入位置を探索 … whileループで「現在の値より小さい要素」の後ろまでインデックスを進めます。
  • splice()で挿入splice(ind, 0, val)により、決定した位置に要素を挿入します。

すべての要素の処理が完了した時点で、アキュムレータには昇順に並べ替えられた配列が格納されています。

降順で並べ替えたい場合

比較条件の不等号を逆向きにするだけで、降順ソートにも簡単に変更できます。

const sortDescWithReduce = arr => {
  return arr.reduce((acc, val) => {
    let ind = 0;
    while (ind < acc.length && val < acc[ind]) {
      ind++;
    }
    acc.splice(ind, 0, val);
    return acc;
  }, []);
};

このように、reduce()とsplice()を組み合わせれば、sort()に頼らずとも簡潔に配列を並べ替えることができます。なお、この手法の計算量はO(n²)であるため、非常に大きな配列を扱う際はパフォーマンスへの影響に注意してください。

  1. JavaScriptで配列要素を並べ替える方法|sortメソッドの基本から比較関数まで徹底解説

    JavaScriptには、配列を並べ替えるための強力な組み込みメソッドが用意されています。その中でも最もよく使われるのが sort() メソッドです。ただし、デフォルトの動作では要素が「文字列」として辞書順(アルファベット順)にソートされるという点に注意が必要です。まずは文字列の配列を並べ替えてみましょう。例:文字列配列のソートlet arr1 = [Zebra, Bear, Tiger]; arr1.sort(); console.log(arr1);出力結果[ Bear, Tiger, Zebra ]文字列の場合は期待通りにアルファベット順に並びました。次に、数値の配列を同じように並べ替え

  2. JavaScriptのArray.prototype.sort()メソッドの使い方をサンプルコードで解説

    Array.prototype.sort()は、JavaScriptで配列の要素を並べ替えるための組み込みメソッドです。アルファベット順・数値順といった並び方に加えて、昇順・降順も自由に指定でき、配列操作の中でも特に使用頻度の高いメソッドの一つです。 ただし重要なポイントとして、sort()メソッドはデフォルトではすべての要素を文字列に変換してから比較します。そのため、数値の配列を意図したとおりに並べ替えたい場合は、比較関数を引数として渡す必要があります。 以下は、Array.prototype.sort()メソッドの基本的な使い方を示すサンプルコードです。 サンプルコード <!DOC