🌊

新しいSetメソッドたち

2024/10/06に公開

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