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

JavaScriptのfilter()メソッドを使って、別の配列に含まれる要素を配列から除外する方法

はじめに

JavaScriptでは、filter()メソッドを活用することで、ある配列から特定の要素だけを取り除いた新しい配列を簡単に作成できます。本記事では、「2つの配列を比較し、1つ目の配列から2つ目の配列に含まれていない要素だけを抽出する」というよくある課題の解決方法を解説します。

問題の概要

たとえば、次のような2つの数値の配列があるとしましょう。

const arr1 = [4, 23, 7, 6, 3, 6, 4, 3, 56, 4];
const arr2 = [4, 56, 23];

このとき、arr2 に含まれていない要素のみを arr1 から抽出し、結果として次のような出力が得られる関数を作成する必要があります。

const output = [7, 6, 3, 6, 3];

実装方法

この問題は、配列の filter() メソッドと indexOf() メソッドを組み合わせることでシンプルに解決できます。indexOf() は該当する要素が見つからない場合に -1 を返すため、これを条件として利用します。

以下が実際のコードです。

const arr1 = [4, 23, 7, 6, 3, 6, 4, 3, 56, 4];
const arr2 = [4, 56, 23];

const filterArray = (arr1, arr2) => {
    const filtered = arr1.filter(el => {
        return arr2.indexOf(el) === -1;
    });
    return filtered;
};

console.log(filterArray(arr1, arr2));

コードのポイント

  • filter()メソッドは、コールバック関数がtrueを返した要素だけを集めた新しい配列を返します。元の配列には影響を与えません。
  • arr2.indexOf(el) === -1という条件により、「elがarr2に存在しない場合」のみ要素が残ります。
  • ES6以降であれば、!arr2.includes(el)と書くことでより直感的に表現することも可能です。

実行結果

上記のコードを実行すると、コンソールには以下の出力が表示されます。

[ 7, 6, 3, 6, 3 ]

ご覧のとおり、arr2に含まれていた 42356 が arr1 からすべて除外され、期待どおりの結果が得られました。

まとめ

filter()indexOf()(またはincludes())を組み合わせれば、配列間の差分抽出をわずか数行のコードで実現できます。元の配列を変更せずに済むため、イミュータブルなデータ操作が求められるモダンなJavaScript開発でも安心して使えるテクニックです。ぜひ日々のコーディングに活用してみてください。

  1. JavaScriptでPriorityQueueから要素を取り出す方法(dequeue関数の実装)

    優先度付きキュー(Priority Queue)から要素を取り出す(デキューする)ということは、最も優先度の高い要素を削除することを意味します。 この実装では、最も優先度の高い要素を配列の末尾に格納しています。そのため、JavaScriptのpop()メソッドを使えば、末尾の要素を簡単に取り出すことができます。 つまり、dequeue関数は次のように実装できます。 Example dequeue() { // キューが空かどうかをチェック if (this.isEmpty()) { console.log(Queue Underflow!); r

  2. JavaScriptでリンクリストから要素を削除する方法

    リンクリストから要素を削除する基本の考え方 リンクリスト(連結リスト)から要素を削除する処理は非常にシンプルです。削除したいノードへの参照を失う(参照を切り離す)だけで実現できます。ただし、削除する位置によって処理が異なるため、次の3つのケースを考慮する必要があります。 ケース1:先頭(ヘッド)から削除する場合 先頭の要素を削除する場合は、head = head.next と代入するだけでOKです。これにより最初のノードへの参照が失われ、headは2番目のノードを指すようになります。 ケース2:末尾(テール)から削除する場合 末尾の要素を削除する場合は、最後から2番目のノードの node.ne