JavaScriptで複数の配列の共通要素(積集合)を求める方法
本記事では、任意の個数の配列を引数として受け取り、すべての配列に共通して含まれる要素だけを集めた配列を返すJavaScript関数の実装方法を解説します。共通する要素がひとつも存在しない場合は、空の配列を返します。
サンプルデータ
例として、次の3つの配列を使って共通要素を求めてみましょう。
const arr1 = [2, 6, 7, 1, 7, 8, 4, 3];
const arr2 = [5, 7, 2, 2, 1, 3];
const arr3 = [1, 56, 345, 6, 54, 2, 68, 85, 3];
実装コード
まず2つの配列の共通要素を求める関数 intersection() を作成し、次にそれを任意の個数の配列に対して繰り返し適用する関数 intersectMany() を定義します。
const arr1 = [2, 6, 7, 1, 7, 8, 4, 3];
const arr2 = [5, 7, 2, 2, 1, 3];
const arr3 = [1, 56, 345, 6, 54, 2, 68, 85, 3];
// 2つの配列の共通要素を求める関数
const intersection = (arr1, arr2) => {
const res = [];
for(let i = 0; i < arr1.length; i++){
if(!arr2.includes(arr1[i])){
continue;
};
res.push(arr1[i]);
};
return res;
};
// 任意の個数の配列に対応する関数
const intersectMany = (...arrs) => {
let res = arrs[0].slice();
for(let i = 1; i < arrs.length; i++){
res = intersection(res, arrs[i]);
};
return res;
};
console.log(intersectMany(arr1, arr2, arr3));
コードの解説
- intersection() 関数: 第1引数の配列を先頭から順に走査し、
Array.prototype.includes()を使ってその要素が第2引数の配列にも存在するかどうかを判定します。存在する場合のみ、結果配列に追加します。 - intersectMany() 関数: 可変長引数(レストパラメータ
...arrs)によって任意の個数の配列を受け取ります。最初の配列のコピーを出発点とし、残りの配列と順番に共通要素を求めていくことで、共通部分を段階的に絞り込みます。
実行結果
コンソールには次の出力が表示されます。
[2, 1, 3]
この結果から、3つの配列すべてに共通して含まれる要素は 2、1、3 の3つであることが確認できます。この手法を使えば、配列の数がいくつであっても柔軟に共通要素を抽出できます。
-
JavaScriptのconst宣言とは?再代入できない変数の基本と使い方を解説
JavaScriptのconst宣言は、値を再代入することも後から再宣言することもできない変数を作成するための構文です。constはES2015(ES6)で導入されました。 const宣言の主な特徴 一度値を代入すると、別の値に再代入することはできません。 同じ名前の変数を同じスコープ内で再宣言するとエラーになります。 宣言時に必ず初期値を代入する必要があります。 ブロックスコープ({}内でのみ有効)を持ちます。 それでは、JavaScriptにおけるconst宣言の実際のコードを見ていきましょう。 サンプルコード <!DOCTYPE html> <html>
-
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]