JavaScriptで再帰を使って配列の連続する重複要素を削除する方法
はじめに
本記事では、数値や文字列のリテラルを含む配列を受け取り、余分なメモリ領域を使わずに連続する重複要素をすべて削除する関数を、JavaScriptの再帰処理を用いて実装する方法を解説します。
例えば、入力配列が以下の場合を見てみましょう。
const arr = [17, 17, 17, 12, 12, 354, 354, 1, 1, 1];
この場合、期待される出力は次のとおりです。
const output = [17, 12, 354, 1];
ポイントは、重複する値そのものをすべて消すのではなく、「隣り合って連続している重複」だけを取り除くことです。
再帰を使った実装例
以下が実際のコードです。
const arr = [17, 17, 17, 12, 12, 354, 354, 1, 1, 1];
const comp = (arr, len = 0, deletable = false) => {
if(len < arr.length){
if(deletable){
arr.splice(len, 1);
len--;
}
return comp(arr, len+1, arr[len] === arr[len+1])
};
return;
};
comp(arr);
console.log(arr);コードの仕組み
- 引数のデフォルト値: 関数 comp は3つの引数(対象の配列、現在のインデックス len、直前の要素と一致しているかを示す deletable)を受け取ります。len の初期値は 0、deletable の初期値は false です。
- 再帰処理: len が配列の長さ未満である限り処理を繰り返します。deletable が true の場合は、splice メソッドで現在位置の要素を削除し、インデックスを1つ戻してズレを補正します。
- 隣接要素との比較: 次の再帰呼び出しでは、現在の要素と次の要素を === で比較した結果を deletable として渡します。これにより、連続する重複のみが削除対象となります。
- 終了条件: len が配列の長さに達すると再帰が終了します。元の配列自体が破壊的に更新されるため、新しい配列を生成する必要はありません。
出力結果
コンソールには以下のように表示されます。
[ 17, 12, 354, 1 ]
このように、追加の配列を一切作らず、元の配列に対して直接操作を行うことで、連続する重複要素だけを効率的に取り除くことができます。再帰と splice を組み合わせたシンプルながら実用的なテクニックなので、ぜひ参考にしてください。
-
JavaScriptでキューから要素を削除する方法(dequeueの実装)
キューから要素をデキュー(dequeue)するととは、キューの先頭(ヘッド)から要素を取り除くことを意味します。本記事では、コンテナ配列の先頭をキューのヘッドとして扱い、すべての操作をこれを基準に行います。dequeue関数の実装キューの先頭から要素を取り出すpop処理は、以下のように実装できます。dequeue() { // キューが空かどうかをチェック if (this.isEmpty()) { console.log(Queue Underflow!); return; } return this.container.shi
-
JavaScriptでPriorityQueueから要素を取り出す方法(dequeue関数の実装)
優先度付きキュー(Priority Queue)から要素を取り出す(デキューする)ということは、最も優先度の高い要素を削除することを意味します。 この実装では、最も優先度の高い要素を配列の末尾に格納しています。そのため、JavaScriptのpop()メソッドを使えば、末尾の要素を簡単に取り出すことができます。 つまり、dequeue関数は次のように実装できます。 Example dequeue() { // キューが空かどうかをチェック if (this.isEmpty()) { console.log(Queue Underflow!); r