Menu
Coddy logo textTech

部分集合と上位集合

CoddyのJavaScriptジャーニー「論理とフロー」セクションの一部 — レッスン 40/65。

集合Aのすべての要素が集合Bの要素でもある場合、集合Aは集合Bの部分集合です。逆に、BがAのすべての要素を含んでいる場合、BはAの超集合です。

2つの集合は、まったく同じ要素を含んでいる場合に等しいとみなされます。例えば、いくつかのテストを作成してみましょう:

const setA = new Set([1, 2, 3]);
const setB = new Set([1, 2, 3, 4, 5]);
const setC = new Set([1, 2, 3]);
const setD = new Set([6, 7, 8]);

setA が setB の部分集合であるかを確認する関数:

function isSubset(setA, setB) {
  return [...setA].every(element => setB.has(element));
}

setAがsetBの上位集合であるかを確認する関数:

function isSuperset(setA, setB) {
  return isSubset(setB, setA);
}

2つの集合が等しいかどうかを確認する関数:

function areEqual(setA, setB) {
  return setA.size === setB.size && isSubset(setA, setB);
}

部分集合の関係をテストしています:

// AはBの部分集合ですか? 
isSubset(setA, setB) // true
// BはAの部分集合ですか? 
isSubset(setB, setA) // false
// DはBの部分集合ですか? 
isSubset(setD, setB) // false

上位集合の関係のテスト:

// BはAのスーパーセット(上位集合)ですか?
isSuperset(setB, setA) // true
// AはBのスーパーセットですか?
isSuperset(setA, setB) // false

等価性のテスト:

// AはCと等しい?
areEqual(setA, setC) // true
// AはBと等しい?
areEqual(setA, setB) // false
// AはDと等しい?
areEqual(setA, setD) // false
challenge icon

チャレンジ

簡単

2つの配列 arr1arr2 を引数として受け取る analyzeSetRelations という関数を作成してください。この関数は配列をセットに変換し、以下のプロパティを持つオブジェクトを返す必要があります。

  • isSubset: set1set2 の部分集合であるかどうかを示す真偽値
  • isSuperset: set1set2 の上位集合であるかどうかを示す真偽値
  • isEqual: set1set2 がまったく同じ要素を持っているかどうかを示す真偽値

チートシート

集合Aのすべての要素が集合Bの要素でもある場合、集合Aは集合Bの部分集合です。逆に、集合Bが集合Aのすべての要素を含んでいる場合、BはAの上位集合です。2つの集合がまったく同じ要素を含んでいる場合、それらは等しいと言えます。

setAがsetBの部分集合であるかを確認します:

function isSubset(setA, setB) {
  return [...setA].every(element => setB.has(element));
}

setAがsetBの上位集合であるかを確認します:

function isSuperset(setA, setB) {
  return isSubset(setB, setA);
}

2つの集合が等しいかを確認します:

function areEqual(setA, setB) {
  return setA.size === setB.size && isSubset(setA, setB);
}

自分で試してみよう

function analyzeSetRelations(arr1, arr2) {
    let set1 = new Set(arr1);
    let set2 = new Set(arr2);

    // .every() と .has() を使用して集合の関係を確認する
    let isSubset = false;   // TODO: set1 のすべての要素が set2 に存在するか確認する
    let isSuperset = false; // TODO: set2 のすべての要素が set1 に存在するか確認する
    let isEqual = false;    // TODO: 両方の集合が同じサイズであり、かつ isSubset が true であるか確認する

    return {
        isSubset: isSubset,
        isSuperset: isSuperset,
        isEqual: isEqual
    };
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理とフローのすべてのレッスン