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

2つの配列から共通しない要素を抽出するJavaScriptプログラム

ここに、2つの数値の配列があるとします。

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

このような2つの配列を受け取り、両方の配列に共通して存在しない要素(片方にしかない要素)だけを返すJavaScript関数を作成する必要があります。

実装の考え方

この問題は、以下の手順で解決できます。

  • 1つ目の配列をループで走査し、その要素が2つ目の配列に存在しない場合は結果に追加する
  • 同様に、2つ目の配列を走査し、1つ目の配列に存在しない要素を結果に追加する

要素の存在確認には、indexOf()メソッドを使用します。このメソッドは、指定した要素が見つからない場合に-1を返すため、これを利用して共通しない要素を判定できます。

コード例

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

const arr1 = [12, 54, 2, 4, 6, 34, 3];
const arr2 = [54, 2, 5, 12, 4, 1, 3, 34];
const unCommonArray = (first, second) => {
   const res = [];
   for(let i = 0; i < first.length; i++){
      if(second.indexOf(first[i]) === -1){
         res.push(first[i]);
      }
   };
   for(let j = 0; j < second.length; j++){
      if(first.indexOf(second[j]) === -1){
         res.push(second[j]);
      };
   };
   return res;
};
console.log(unCommonArray(arr1, arr2));

出力結果

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

[ 6, 5, 1 ]

コードの解説

このコードでは、まずアロー関数unCommonArrayを定義しています。内部では空の配列resを用意し、1つ目のforループでfirstの各要素がsecondに含まれていないかをindexOf()でチェックします。-1が返された場合(=存在しない場合)、その要素をresに追加します。2つ目のforループでも同様の処理を行い、最終的にresを返します。

その結果、6(arr1のみに存在)、51(arr2のみに存在)が出力されます。

補足:よりモダンな書き方

ES6以降では、filter()メソッドとincludes()メソッドを組み合わせることで、同じ処理をより簡潔に記述できます。

const unCommonArray = (first, second) =>
   first.filter(el => !second.includes(el))
        .concat(second.filter(el => !first.includes(el)));

console.log(unCommonArray(arr1, arr2)); // [ 6, 5, 1 ]

どちらの方法でも結果は同じですが、filter()を使った書き方は可読性が高く、意図が伝わりやすいのが特徴です。用途やチームのコーディング規約に応じて使い分けるとよいでしょう。

  1. JavaScriptで2つの配列のサブセット(部分集合)を判定する方法

    リテラル値からなる2つの配列を受け取り、第2引数の配列が第1引数の配列の部分集合(サブセット)であるかどうかを判定するJavaScript関数を作成する必要があります。この判定を行う際には、以下の条件を考慮する必要があります。array2には、array1に含まれるすべての値が定義されている必要があるarray1に重複した値が存在する場合、その重複数もarray2側で考慮されなければならない具体例たとえば、arr1 = [a, a] と arr2 = [b, a] を比較すると、「a」は最初の配列に2回登場していますが、2番目の配列では1回しか登場していないため、isSubset の結果は f

  2. JavaScriptで2つの配列の対応する値を比較して優勢を判定する方法

    はじめにJavaScriptでは、同じ長さの2つの配列を受け取り、対応する位置にある要素同士を比較して「どちらの配列が優勢か」を判定したいケースがあります。本記事では、そのような比較を行う関数をシンプルなコードで実装する方法を解説します。前提となるデータまず、長さが同じ2つの数値配列を用意します。const arr1 = [23, 67, 12, 87, 33, 56, 89, 34, 25];const arr2 = [12, 60, 45, 54, 67, 84, 36, 73, 44];要件上記のような2つの配列を第1引数・第2引数として受け取るJavaScript関数を作成します。関数