JavaScriptで2つの配列の和集合を求める方法【初心者向け解説】
プログラミングにおいて、集合演算はデータ処理の基本となる重要な概念です。本記事では、JavaScriptを使って2つの配列から和集合(Union)を求める方法を、実際のコード例とともにわかりやすく解説します。
和集合とは?
和集合とは、2つの集合の要素をすべて組み合わせて作られる集合のことです。つまり、集合Aと集合Bの和集合は、「Aに含まれる要素、Bに含まれる要素、またはその両方に含まれる要素」の集まりになります。
ポイントは、重複する要素は1つだけ残すという点です。これにより、すべてのユニークな要素を持つ新しい集合が得られます。
具体例
例として、次のような2つの配列があるとします。
const arr1 = [1, 2, 3]; const arr2 = [100, 2, 1, 10];
この2つの配列の和集合は、以下のようになります。
const union = [1, 2, 3, 10, 100];
2と1は両方の配列に含まれていますが、結果にはそれぞれ1回だけ現れますね。このように、重複を排除した全要素のリストが和集合です。
JavaScriptで和集合を求める関数の実装
それでは、2つの配列を受け取り、それらの和集合を返すJavaScript関数を作成してみましょう。
ここでは、オブジェクト(マップ)を利用して重複を管理する方法を採用します。キーの一意性を活かすことで、効率的に和集合を求められます。
const arr1 = [1, 2, 3];
const arr2 = [100, 2, 1, 10];
const findUnion = (arr1 = [], arr2 = []) => {
const map = {};
const res = [];
// arr1 の要素をマップに登録
for (let i = arr1.length - 1; i >= 0; --i) {
map[arr1[i]] = arr1[i];
}
// arr2 の要素もマップに登録(重複は自動的に上書きされる)
for (let i = arr2.length - 1; i >= 0; --i) {
map[arr2[i]] = arr2[i];
}
// マップの値を結果配列に格納
for (const n in map) {
if (map.hasOwnProperty(n)) {
res.push(map[n]);
}
}
return res;
};
console.log(findUnion(arr1, arr2));
コードの仕組み
- マップへの登録: 各配列の要素をオブジェクトのキーとして保存します。同じ値が複数回登場しても、キーは上書きされるだけなので、自然と重複が排除されます。
hasOwnProperty()によるチェック: プロトタイプチェーン上のプロパティを誤って取得しないよう、オブジェクト自身が持つプロパティのみを対象にしています。- 計算量: 各配列を一度ずつ走査するため、時間計算量は O(n + m)(n、mは各配列の長さ)となり、非常に効率的です。
実行結果
上記のコードをコンソールで実行すると、次の出力が得られます。
[ 1, 2, 3, 10, 100 ]
期待どおり、重複のない和集合が取得できました。
補足:Setを使ったよりシンプルな書き方
モダンなJavaScript(ES6以降)では、標準組み込みの Set オブジェクトを使うことで、さらに簡潔に和集合を求められます。
const union = [...new Set([...arr1, ...arr2])]; console.log(union); // [ 1, 2, 3, 100, 10 ]
Setは自動的に重複を排除してくれるため、スプレッド構文と組み合わせるだけで1行で実装できます。コードの可読性を重視する場合は、こちらの方法がおすすめです。
まとめ
- 和集合とは、2つの集合の全要素を重複なく組み合わせた集合である
- オブジェクト(マップ)のキーの一意性を利用すれば、効率的に和集合を求められる
- ES6以降なら
new Set()を使うことで、1行でシンプルに実装可能
用途や環境に応じて、最適な方法を選んで活用してください。
-
JavaScriptで2つのセットを結合する方法(和集合・ユニオンの実装)
2つのセットを追加する操作は「和集合(ユニオン)」と呼ばれます。これは、片方のセットに含まれるすべての要素を新しいセットに追加しながら、重複を排除していく処理です。すでに実装済みのメソッドを組み合わせれば、この操作は簡単に実現できます。既存のセットを変更(ミューテート)せず、新しいセットを作成して返す設計とするため、この関数は静的メソッドとして実装します。まず最初に、引数として渡されたオブジェクトが本当にMySetクラスのインスタンスであるかを検証しましょう。実装例static union(s1, s2) { if (!(s1 instanceof MySet) || !(s2 insta
-
JavaScriptのconst宣言とは?再代入できない変数の基本と使い方を解説
JavaScriptのconst宣言は、値を再代入することも後から再宣言することもできない変数を作成するための構文です。constはES2015(ES6)で導入されました。 const宣言の主な特徴 一度値を代入すると、別の値に再代入することはできません。 同じ名前の変数を同じスコープ内で再宣言するとエラーになります。 宣言時に必ず初期値を代入する必要があります。 ブロックスコープ({}内でのみ有効)を持ちます。 それでは、JavaScriptにおけるconst宣言の実際のコードを見ていきましょう。 サンプルコード <!DOCTYPE html> <html>