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

JavaScriptで配列から連続する重複要素を再帰的に削除する方法

数値リテラルからなる配列に、次のような連続した重複する値が含まれている場合を考えてみましょう。

const testArr = [1, 1, 2, 2, 3, 3, 1, 1, 1];

ここでの課題は、この配列を受け取り、連続する重複要素をすべて元の配列上で直接削除する関数 compress を作成することです。期待される出力は次のとおりです。

const output = [1, 2, 3, 1];

再帰を使った実装例

それでは、再帰処理を使ってこの関数を実装してみましょう。コードは以下の通りです。

const testArr = [1, 1, 2, 2, 3, 3, 1, 1, 1];
const compress = (arr, len = 0, canDelete = false) => {
    if(len < arr.length){
        if(canDelete){
            arr.splice(len, 1);
            len--;
        }
        return compress(arr, len+1, arr[len] === arr[len+1])
    };
    return;
};
compress(testArr);
console.log(testArr);

コードの解説

この関数は3つの引数を受け取ります。それぞれの役割は以下の通りです。

  • arr: 処理対象となる配列本体
  • len: 現在注目しているインデックス(初期値は0)
  • canDelete: 直前の要素と現在の要素が一致しているかどうかを示すフラグ

処理の流れは次のようになっています。

  • arr[len]arr[len+1] を比較し、両者が等しければ、次の再帰呼び出し時に canDeletetrue になります。
  • canDeletetrue の場合、splice メソッドによって重複要素を配列から取り除き、インデックスを1つ戻すことで位置のずれを補正します。
  • len が配列の長さに達すると再帰が終了し、配列全体から連続する重複がなくなった状態で処理が完了します。

なお、この方法で削除されるのは「隣り合っている」重複のみである点に注意してください。そのため、末尾の 1 のように、前の出現箇所と離れている要素は意図的に残されます。

出力結果

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

[ 1, 2, 3, 1 ]
  1. JavaScriptで配列の要素を同じ配列内に複製する方法

    JavaScriptでは、concat()メソッドとsort()メソッドを組み合わせることで、既存の配列の要素を同じ配列内に複製することができます。ここでは、実際に動作するサンプルコードを使って、その手順をわかりやすく解説します。 コード例 以下は、配列の要素を同じ配列内に複製するためのコード例です。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" cont

  2. Swiftの配列から特定の要素を削除する方法を徹底解説

    Swiftで配列から特定の要素を削除したい場合、いくつかの方法があります。この記事では、実際のコード例を交えながら、代表的な2つの方法をわかりやすく解説します。 まずは、String型の配列を用意しましょう。 var arrayOfString = [a,b,c,f] この配列を使って、以下の2つの方法で特定の要素を削除していきます。 方法1:filterメソッドを使う Swiftの配列にはfilterメソッドが標準で用意されています。これは、指定した条件に基づいて要素を絞り込み、新しい配列として返すメソッドです。削除したい要素を条件から除外することで、実質的にその要素を取り除くことができます