🌊
新しいSetメソッドたち
2024年7月にSetオブジェクトに便利なメソッドが追加されていましたが、
個人的にSetオブジェクトを使う意識が足りてなく、配列メソッドを使っていた場面があったので、自分への戒めとしてまとめました。
新しく追加されたSetメソッド
- intersection
- union
- difference
- symmetricDifference
- isSubsetOf
- isSupersetOf
- isDisjointFrom
intersection
2つのSet間の共通要素を含む新しいSetを返します。
const setA = new Set([1, 2, 3, 4]);
const setB = new Set([3, 4, 5, 6]);
const intersection = setA.intersection(setB);
console.log([...intersection]); // [3, 4]
配列メソッドでやると以下のようになります。
const arrayA = [1,2,3,4];
const arrayB = [3,4,5,6];
const intersection = arrayA.filter(element => arrayB.includes(element));
console.log(intersection); // [3, 4]
union
2つのSet間の和集合を生成し、新しいSetを返します。
const setA = new Set([1, 2, 3, 4]);
const setB = new Set([3, 4, 5, 6]);
const union = setA.union(setB);
console.log([...union]); // [1, 2, 3, 4, 5, 6]
配列メソッドでやると以下のようになります。
const arrayA = [1, 2, 3, 4];
const arrayB = [3, 4, 5, 6];
const union = arrayA.concat(arrayB.filter(element => !arrayA.includes(element)));
console.log(union); // [1, 2, 3, 4, 5, 6]
difference
2つのSet間の差集合を生成し、新しいSetを返します。
const setA = new Set([1, 2, 3, 4]);
const setB = new Set([3, 4, 5, 6]);
const diffA = setA.difference(setB);
console.log([...diffA]); // [1, 2]
const diffB = setB.difference(setA);
console.log([...diffB]); // [5, 6]
配列メソッドでやると以下のようになります。
const arrayA = [1, 2, 3, 4];
const arrayB = [3, 4, 5, 6];
const diffA = arrayA.filter(element => !arrayB.includes(element));
console.log(diffA); // [1, 2]
const diffB = arrayB.filter(element => !arrayA.includes(element));
console.log(diffB); // [5, 6]
symmetricDifference
2つのSetの対称差を求めるメソッドです。
※対称差とは、どちらか一方の集合にのみ含まれる要素の集合を指します。
const setA = new Set([1, 2, 3, 4, 5]);
const setB = new Set([3, 4, 5, 6, 7]);
const symDiff = setA.symmetricDifference(setB);
console.log([...symDiff]); // [1, 2, 6, 7]
配列メソッドでやると以下のようになります。
const arrayA = [1, 2, 3, 4, 5];
const arrayB = [3, 4, 5, 6, 7];
const diffA = arrayA.filter(element => !arrayB.includes(element));
const diffB = arrayB.filter(element => !arrayA.includes(element));
console.log([...diffA, ...diffB]); // [1, 2, 6, 7]
isSubsetOf
あるSetが別のSetのサブセット(部分集合)であるかどうかを判定します。
const setA = new Set([1, 2]);
const setB = new Set([1, 2, 3]);
console.log(setA.isSubsetOf(setB)); // true
console.log(setB.isSubsetOf(setA)); // false
配列メソッドでやると以下のようになります。
const arrayA = [1, 2];
const arrayB = [1, 2, 3];
const isSubsetA = arrayA.every(element => arrayB.includes(element));
console.log(isSubsetA) // true
const isSubsetB = arrayB.every(element => arrayA.includes(element));
console.log(isSubsetB) // false
isSupersetOf
あるSetが別のSetのスーパーセット(上位集合)であるかどうかを判定します。
const setA = new Set([1, 2, 3, 4]);
const setB = new Set([2, 3]);
console.log(setA.isSupersetOf(setB)); // true
console.log(setB.isSupersetOf(setA)); // false
配列メソッドで以下のようになります。
const arrayA = [1, 2, 3, 4];
const arrayB = [2, 3];
const isSubsetA = arrayB.every(element => arrayA.includes(element));
console.log(isSubsetA) // true
const isSubsetB = arrayA.every(element => arrayB.includes(element));
console.log(isSubsetB) // false
isDisjointFrom
2つのSetが互いに素であるかどうかを判定します。
(共通の要素を持たない場合はtrueを、共通の要素がある場合はfalseを返します。)
const setA = new Set([1, 2, 3]);
const setB = new Set([4, 5, 6]);
console.log(setA.isDisjointFrom(setB)); // true
const setC = new Set([3, 4, 5]);
console.log(setA.isDisjointFrom(setC)); // false
console.log(setB.isDisjointFrom(setC)); // false
配列メソッドで以下のようになります。
const arrayA = [1, 2, 3];
const arrayB = [4, 5, 6];
const isDisjointFrom1 = arrayA.every(element => !arrayB.includes(element));
console.log(isDisjointFrom1); // true
const isDisjointFrom2 = arrayB.every(element => !arrayA.includes(element));
console.log(isDisjointFrom2); // true
const arrayC = [3, 4, 5];
const isDisjointFrom3 = arrayA.every(element => !arrayC.includes(element));
console.log(isDisjointFrom3); // false
const isDisjointFrom4 = arrayB.every(element => !arrayC.includes(element));
console.log(isDisjointFrom4); // false
ブラウザの互換性
全ブラウザで問題なく使用可能です。
intersection
union
difference
symmetricDifference
isSubsetOf
isSupersetOf
isDisjointFrom
Discussion