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

JavaScriptで2つの配列を比較し、共通しない要素を取得する方法

はじめに

共通の値を一部含む2つの配列があるとき、「どちらか一方にしか存在しない要素」だけを抽出した新しい配列を返す関数を作成する方法を解説します。

例を見てみましょう。

// 2つの配列が以下の場合:
const first = ['cat', 'dog', 'mouse'];
const second = ['zebra', 'tiger', 'dog', 'mouse'];
// 期待される出力:
const output = ['cat', 'zebra', 'tiger']
// この3つの要素だけが両方の配列に共通しないためです

実装方法

この問題は、スプレッド構文(...)を使って2つの配列を結合し、filter()メソッドで「両方の配列に存在する要素」を除外することで解決できます。

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

コード例

const first = ['cat', 'dog', 'mouse'];
const second = ['zebra', 'tiger', 'dog', 'mouse'];

const removeCommon = (first, second) => {
    const spreaded = [...first, ...second];
    return spreaded.filter(el => {
        return !(first.includes(el) && second.includes(el));
    })
};

console.log(removeCommon(first, second));

処理の流れ

  1. スプレッド構文 [...first, ...second] で2つの配列を1つに結合します。
  2. filter() メソッドで結合した配列の各要素を順番にチェックします。
  3. first.includes(el) && second.includes(el) が true(=両方の配列に存在する)の場合、その要素を除外します。

出力結果

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

[ 'cat', 'zebra', 'tiger' ]

まとめ

スプレッド構文と filter() メソッドを組み合わせることで、2つの配列の対称差(共通しない要素)をシンプルに求めることができます。なお、配列のサイズが大きい場合は、includes() の代わりに Set を使って判定するとパフォーマンスを向上させられるので、覚えておくと便利です。

  1. JavaScriptで配列から奇数以外の値を抽出して返す方法

    問題 数値の配列を受け取るJavaScript関数を作成することを考えます。 この関数は、入力された配列に含まれる数値のうち奇数ではない要素だけを集め、それらを格納した新しい配列を構築して返す必要があります。 サンプルコード 以下がその実装例です。 const arr = [5, 32, 67, 23, 55, 44, 23, 12]; const findNonOdd = (arr = []) => {    const res = [];    for(let i = 0; i < arr.length; i++){   &n

  2. JavaScriptで2つの配列をマージして重複を削除する方法

    課題 JavaScriptで、2つの数値の配列 arr1 と arr2 を引数として受け取る関数を作成することを考えます。 この関数は、両方の配列の要素を1つの新しい配列にマージします。マージの前後いずれかの時点で重複する要素が存在した場合には、余分なコピーを削除し、各要素が必ず1回だけ現れるようにしなければなりません。 要素の並び順は厳密には問われませんが、各要素の出現回数(必ず1回であること)が重要なポイントになります。 入力例 const arr1 = [6, 5, 2, 1, 8]; const arr2 = [3, 4, 6, 8, 9]; この場合、期待される出力は次のとおりです。