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

JavaScriptで2つの配列の差分(共通しない要素)を見つける方法

はじめに

JavaScriptでは、2つの配列を比較して「片方にしか存在しない要素」を取り出したい場面がよくあります。例えば、以下のような2つの数値配列があったとします。

const arr1 = [12, 54, 2, 4, 6, 34, 3];
const arr2 = [54, 2, 5, 12, 4, 1, 3, 34];

この2つの配列には、両方に含まれる共通の要素(12、54、2、4、3、34)があります。一方で、arr1 にだけある要素は「6」、arr2 にだけある要素は「5」と「1」です。

今回は、2つの配列を受け取って、どちらか一方にのみ存在する要素をすべて返す関数を作成します。

実装コード

以下がその実装例です。

const arr1 = [12, 54, 2, 4, 6, 34, 3];
const arr2 = [54, 2, 5, 12, 4, 1, 3, 34];

const difference = (first, second) => {
   const res = [];
   // first 側で、second に存在しない要素を追加
   for(let i = 0; i < first.length; i++){
      if(second.indexOf(first[i]) === -1){
         res.push(first[i]);
      }
   };
   // second 側で、first に存在しない要素を追加
   for(let j = 0; j < second.length; j++){
      if(first.indexOf(second[j]) === -1){
         res.push(second[j]);
      };
   };
   return res;
};

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

コードの解説

処理の流れはシンプルです。

  • まず結果を格納する空の配列 res を用意します。
  • 1つ目のループでは、first の各要素に対して indexOf() を使い、second に存在しない場合(戻り値が -1 の場合)のみ res に追加します。
  • 2つ目のループでは逆に、second の各要素が first に存在しない場合のみ追加します。
  • 最終的に、両方のループで集めた「差分の要素」をまとめて返します。

実行結果

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

[ 6, 5, 1 ]

ご覧のとおり、両方の配列に共通して存在する要素は除外され、片方にしかない要素だけが抽出されています。

補足:より簡潔な書き方

filter()includes() を組み合わせると、同じ処理をもっと簡潔に書くこともできます。

const difference = (first, second) => [
   ...first.filter(el => !second.includes(el)),
   ...second.filter(el => !first.includes(el))
];

こちらの書き方は可読性が高く、モダンなJavaScriptらしい実装と言えるでしょう。

まとめ

2つの配列の差分を求める基本的な考え方は、「相手側の配列に存在するかどうかを1つずつ確認し、存在しないものだけを集める」というものです。indexOf()includes()filter() を活用することで、短いコードで効率的に差分を抽出できます。

  1. JavaScriptで2つの区間配列の共通部分を求める方法【2ポインタ法】

    問題概要本記事では、2つの区間(インターバル)配列を受け取り、その共通部分を返すJavaScript関数を実装します。入力となる配列 arr1 と arr2 には以下の前提があります。各区間は互いに重なり合わない(pairwise disjoint)各区間はソートされた順序で格納されている閉区間 [a, b](a ≤ b)は、a ≤ x ≤ b を満たす実数 x の集合を表します。また、2つの閉区間の共通部分(積集合)は、空集合になるか、あるいは1つの閉区間として表現できます。例えば、[1, 3] と [2, 4] の共通部分は [2, 3] です。入力例const arr1 = [[0,2]

  2. JavaScriptで2つの配列間の欠落した数値を見つける方法

    問題の概要 2つの配列 arr1 と arr2 を引数として受け取るJavaScript関数を作成します。 arr2 は arr1 の要素をシャッフルした複製ですが、たった1つの要素だけが欠落しています。 この関数の目的は、その欠落している1つの要素を見つけ出して返すことです。 アプローチのポイント 最もシンプルかつ効率的なのは、ハッシュマップ(オブジェクト)を使って各数値の出現回数を記録する方法です。計算量は O(n) に抑えられ、配列内に重複した値が含まれていても正しく動作します。 コード例 以下が実際のコードです。 const arr1 = [6, 1, 3, 6, 8, 2];