JavaScriptで2つのセットの差集合(減算)を求める方法
2つのセットの差集合とは、引かれる側のセットから、引く側のセットに含まれるすべての要素を取り除いた結果のことです。この操作を実現するには、2番目のセットを走査しながら、その中に存在する要素を1番目のセットからすべて削除していきます。
カスタムSetクラスでの実装例
static difference(s1, s2) {
if (!s1 instanceof MySet || !s2 instanceof MySet) {
console.log("指定されたオブジェクトはMySet型ではありません");
return null;
}
let newSet = new MySet();
s1.forEach(elem => newSet.add(elem));
s2.forEach(elem => newSet.delete(elem));
return newSet;
}
この関数は、次のようにしてテストできます。
動作確認の例
const testSet1 = new MySet(); testSet1.add(1); testSet1.add(2); const testSet2 = new MySet(); testSet2.add(2); testSet2.add(5); let testSet3 = MySet.difference(testSet1, testSet2); testSet3.display();
出力
上記のコードを実行すると、次の出力が得られます。
{ '1': 1 }
組み込みのSetクラスを拡張する方法
なお、差集合を求める関数はES6の標準APIにも用意されていません。しかし、以下のようにSetクラス自体にこの機能を追加することで、どのセットに対しても利用できるようになります。
実装例
Set.difference = function(s1, s2) {
if (!s1 instanceof Set || !s2 instanceof Set) {
console.log("指定されたオブジェクトはSet型ではありません");
return null;
}
let newSet = new Set();
s1.forEach(elem => newSet.add(elem));
s2.forEach(elem => newSet.delete(elem));
return newSet;
}
動作確認の例
let setA = new Set([1, 2, 3, 4]); let setB = new Set([2, 3]); console.log(Set.difference(setA, setB));
出力
上記のコードを実行すると、次の出力が得られます。
Set { 1, 4 }
この実装では、まずs1の全要素を新しいセットnewSetにコピーし、その後でs2に含まれる各要素をnewSetから削除しています。これにより、「s1には存在するがs2には存在しない要素」だけが残ります。上記の例では、setAからsetBの要素である2と3を取り除いた結果として、{ 1, 4 }が得られています。
-
JavaScriptで配列をSet(セット)に変換する方法
JavaScriptで配列をSetに変換するときの基本JavaScriptでは、Setオブジェクトを使うことで、配列から重複しない一意の値だけを持つコレクションを簡単に作成できます。SetはES6(ECMAScript 2015)で導入された組み込みオブジェクトで、同じ値が複数回追加されても自動的に1つにまとめられるのが特徴です。変換自体は非常にシンプルで、new Set(配列)と書くだけで完了します。コード例:配列からSetへの変換以下は、重複を含む配列をSetに変換して画面に表示するサンプルコードです。<!DOCTYPE html> <html lang=ja> &
-
JavaScriptにおける配列とSetの違いとは?重複値の扱いと要素アクセスをわかりやすく解説
JavaScriptのSet(セット)オブジェクトは、ES2015(ES6)で新たに導入されたデータ型です。従来から広く使われている配列(Array)と比べると、いくつか重要な違いがあります。 配列とSetの主な違い 重複した値の扱い: 配列は同じ値をいくつでも格納できますが、Setでは同一の値は1つしか保持されません。重複した値は自動的に除外されるのが大きな特徴です。 要素へのアクセス方法: 配列ではインデックス(例:arr[0])を使って任意の位置の要素へ直接アクセスできます。一方、Setにはインデックスの概念がなく、要素は挿入された順序どおりに先頭から順番に辿ることしかできません。