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

JavaScriptでインデックスを指定してネストされた配列から要素を削除する方法

はじめに

JavaScriptでは、オブジェクトが入れ子になった配列(ネストされた配列)を扱う場面がよくあります。本記事では、指定したインデックスのパスに従って、ネストされた配列から特定の要素を削除する方法を解説します。

例として、次のようなネストされたオブジェクト配列を考えてみましょう。

const arr = [
    { value: 'some value' },
    {
       array: [
          { value: 'some value' },
          {
            array: [
               { value: 'some value' },
               { value: 'some value' },
            ],
          },
          { value: 'some value' },
          {
            array: [
               { value: 'some value' },
               {
                 array: [
                   { value: 'delete me' },
                   { value: 'some value' },
                 ]
               },
            ],
          },
       ],
    }
];

実装したい処理の内容

ここで必要となるのは、次のようなJavaScript関数です。

  • 第1引数:上記のようなネストされた配列
  • 第2引数:削除対象の位置を示すインデックスの配列

この関数は、第2引数で指定されたインデックスのパスに沿って配列をたどり、該当する要素を削除した新しい配列を返します。元の配列を壊さずに処理できる点がポイントです。

コード例

実際のコードは以下の通りです。

const arr = [
    { value: 'some value' },
    {
       array: [
          { value: 'some value' },
          {
            array: [
               { value: 'some value' },
               { value: 'some value' },
            ],
          },
          { value: 'some value' },
          {
            array: [
               { value: 'some value' },
               {
                 array: [
                   { value: 'delete me' },
                   { value: 'some value' },
                 ]
               },
            ],
          },
       ],
    }
];
const keys = [1, 3, 1, 0];
const getKeys = (arr, keys) => {
    const recursiveFind = (arr, level) => {
      const res = [];
      arr.forEach((el, ind) => {
         if (keys[level] !== ind) {
            return res.push(el);
         };
         if (level + 1 !== keys.length && el.array) {
            res.push({ array: recursiveFind(el.array, level + 1) });
         };
      });
      return res;
    };
    return recursiveFind(arr, 0);
};
console.log(JSON.stringify(getKeys(arr, keys), undefined, 4));

コードの解説

このコードの仕組みを簡単に説明します。

  • keys配列[1, 3, 1, 0] は、最上位の配列の1番目 → その中の array の3番目 → さらにその中の1番目 → その中の0番目、という削除対象へのパスを表しています。
  • recursiveFind関数:現在の階層(level)に対応するインデックスと一致する要素をスキップし、それ以外の要素を結果配列に格納します。
  • 再帰処理:まだ最終階層に達しておらず、かつ要素が array プロパティを持つ場合は、その子配列に対して再帰的に同じ処理を適用します。
  • 削除対象の要素は res に追加されないため、結果として配列から取り除かれます。

実行結果

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

[
    {
        "value": "some value"
    },
    {
        "array": [
            {
                "value": "some value"
            },
            {
                "array": [
                    {
                        "value": "some value"
                    },
                    {
                        "value": "some value"
                    }
                ]
            },
            {
                "value": "some value"
            },
            {
                "array": [
                    {
                        "value": "some value"
                    },
                    {
                        "array": [
                            {
                                "value": "some value"
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

出力を見ると、{ value: 'delete me' } だった要素が削除され、その親の array には { value: 'some value' } のみが残っていることが確認できます。

まとめ

このように、インデックスの配列と再帰処理を組み合わせることで、任意の深さにネストされた配列からでも柔軟に要素を削除できます。元のデータを変更せずに新しい配列を生成するため、イミュータブルなデータ操作が求められるReactなどの開発场景でも安心して使えるアプローチです。

  1. JavaScriptのArray.from()メソッドとは?使い方と実例をわかりやすく解説

    Array.from()メソッドは、配列風オブジェクト(array-like)や反復可能オブジェクト(iterable)から、新しい配列オブジェクトを作成するための便利なメソッドです。文字列、Map、Set、NodeListなど、さまざまなデータを手軽に配列へ変換できます。 Array.from()の基本的な動作 例えば、文字列「HelloWorld」に対してArray.from()を使用すると、1文字ずつ分割された新しい配列が生成されます。以下に実際のコード例を示します。 サンプルコード <!DOCTYPE html> <html lang="ja"&g

  2. JavaScriptで2つのオブジェクトを比較しながら配列のネストされた値をグループ化する方法

    この記事では、2つのオブジェクト(before と after)を比較しながら、ネストされた配列の値を1つの行にグループ化する方法を解説します。データの差分を表形式で整理したい場合などに役立つテクニックです。入力データの例まず、次のようなJSONオブジェクトがあるとします。before(変更前)と after(変更後)の2つの状態が含まれ、それぞれの device 配列の中に、id、price、features(機能名と価格)というネストされた構造を持っています。const input = { before: { device: [ { id: 1234