Signatur
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
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
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)}`);
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())));
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))));
// Wichtig · Fallstricke
- Keine Arrays: Übergibst du ein Array, gibt es einen
TypeError, weil Arrays wedersizenochhas()besitzen. Wandle es vorher mitnew Set(array)um. - Unecht statt echt:
a.isSubsetOf(a)ergibttrue. Für eine echte Teilmenge prüfe zusätzlicha.size < b.size. - Objektvergleich über die Referenz:
new Set([{id: 1}]).isSubsetOf(new Set([{id: 1}]))ergibtfalse, weil es zwei verschiedene Objekte sind. - Eigene set-ähnliche Objekte:
other.sizewird genau einmal gelesen und muss eine Zahl sein. Lieferthas()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.