Start · Sprachen · JavaScript · Referenz · Set.prototype.isSubsetOf()

Set.prototype.isSubsetOf()

Methode

Prüft, ob jedes Element dieses <code>Set</code> auch in der übergebenen Menge <code>other</code> enthalten ist, und gibt <code>true</code> oder <code>false</code> zurück.

seit JavaScript ES2025 (Baseline 2024: Chrome 122, Firefox 127, Sa Kategorie: method-property

Signatur

Set.prototype.isSubsetOf(other)

Beschreibung

Die Methode isSubsetOf() prüft die mathematische Teilmengen-Beziehung: A.isSubsetOf(B) liefert true, wenn jedes Element von A auch in B vorkommt. Eine leere Menge ist Teilmenge jeder Menge, und jede Menge ist Teilmenge von sich selbst. Es handelt sich also um eine unechte Teilmenge. Eine echte Teilmenge erhältst du zusätzlich über den Vergleich A.size < B.size.

Als Argument muss kein echtes Set übergeben werden. Es genügt ein set-ähnliches Objekt, also ein Objekt mit einer numerischen Eigenschaft size sowie den Methoden has() und keys(). Dazu gehört zum Beispiel eine Map, deren Schlüssel dann als Elemente gelten. Arrays sind keine set-ähnlichen Objekte und lösen einen TypeError aus.

Typische Einsätze sind Berechtigungsprüfungen („hat der Nutzer alle benötigten Rechte?“), Validierungen von Pflichtfeldern oder Tag-Filter. Elemente werden wie bei Set üblich nach dem Algorithmus SameValueZero verglichen. NaN gilt dabei als gleich NaN, Objekte werden über ihre Referenz verglichen.

Zur Laufzeit: Ist this.size größer als other.size, gibt die Methode sofort false zurück. Andernfalls durchläuft sie die eigenen Elemente und ruft für jedes other.has() auf. Beim ersten Treffer, der fehlt, bricht sie ab.

Parameter

Name Typ Default Beschreibung
$other Pflicht Set | Map | set-ähnliches Objekt Die Menge, gegen die geprüft wird. Sie braucht eine Eigenschaft size (Zahl, nicht NaN) sowie die Methoden has() und keys().

Rückgabewert

Typ
boolean
Beschreibung
true, wenn alle Elemente dieses Sets auch in other enthalten sind, sonst false.

Beispiele

Grundlegende Teilmengen-Prüfung

const gerade = new Set([2, 4, 6]);
const zahlen = new Set([1, 2, 3, 4, 5, 6]);

console.log(gerade.isSubsetOf(zahlen));   // alle enthalten
console.log(zahlen.isSubsetOf(gerade));   // 1, 3, 5 fehlen
console.log(new Set().isSubsetOf(gerade)); // leere Menge
console.log(gerade.isSubsetOf(gerade));    // Menge selbst
true false true true

Berechtigungsprüfung für eine Aktion

const benoetigt = new Set(['lesen', 'schreiben']);

const darfBearbeiten = (user) =>
  benoetigt.isSubsetOf(new Set(user.rechte));

const anna = { name: 'Anna', rechte: ['lesen', 'schreiben', 'löschen'] };
const ben = { name: 'Ben', rechte: ['lesen'] };

console.log(`${anna.name}: ${darfBearbeiten(anna)}`);
console.log(`${ben.name}: ${darfBearbeiten(ben)}`);
Anna: true Ben: false

Map als set-ähnliches Argument und echte Teilmenge

const lager = new Map([
  ['apfel', 12],
  ['birne', 3],
  ['kiwi', 0]
]);
const bestellung = new Set(['apfel', 'kiwi']);

// Die Schlüssel der Map gelten als Elemente
console.log(bestellung.isSubsetOf(lager));

// Echte Teilmenge: Teilmenge und zugleich kleiner
const istEchteTeilmenge = (a, b) => a.isSubsetOf(b) && a.size < b.size;
console.log(istEchteTeilmenge(bestellung, new Set(lager.keys())));
true true

Arrays vorher in ein Set umwandeln

const pflichtfelder = new Set(['name', 'email']);
const formular = { name: 'Max', email: 'max@example.com', alter: 30 };

try {
  pflichtfelder.isSubsetOf(Object.keys(formular)); // Array -> Fehler
} catch (err) {
  console.log(err.constructor.name);
}

console.log(pflichtfelder.isSubsetOf(new Set(Object.keys(formular))));
TypeError true

// Wichtig · Fallstricke

  • Keine Arrays: Übergibst du ein Array, gibt es einen TypeError, weil Arrays weder size noch has() besitzen. Wandle es vorher mit new Set(array) um.
  • Unecht statt echt: a.isSubsetOf(a) ergibt true. Für eine echte Teilmenge prüfe zusätzlich a.size < b.size.
  • Objektvergleich über die Referenz: new Set([{id: 1}]).isSubsetOf(new Set([{id: 1}])) ergibt false, weil es zwei verschiedene Objekte sind.
  • Eigene set-ähnliche Objekte: other.size wird genau einmal gelesen und muss eine Zahl sein. Liefert has() falsche Werte, ist auch das Ergebnis falsch. Die Methode verlässt sich vollständig auf diese Schnittstelle.
  • Kompatibilität: Die Methode ist neu (Chrome/Edge 122, Firefox 127, Safari 17, Node.js 22). Für ältere Umgebungen gibt es ein Polyfill über core-js, oder du nutzt den Ersatz [...a].every((x) => b.has(x)).
  • In TypeScript sind die Typen erst ab lib: [\"esnext\"] bzw. \"es2025\" verfügbar.