Signatur
Beschreibung
difference() berechnet die Differenzmenge A \ B: Das Ergebnis enthält jedes Element von this (A), das in other (B) nicht vorkommt. Beide Ausgangs-Sets bleiben unverändert, zurückgegeben wird immer ein neues Set.
Typische Einsatzfälle sind der Vergleich von Datenständen („welche IDs sind neu?“, „welche Berechtigungen fehlen?“), das Herausfiltern bereits verarbeiteter Einträge oder das Entfernen gesperrter Werte aus einer Auswahl. Früher schrieb man dafür new Set([...a].filter(x => !b.has(x))). Die eingebaute Methode ist kürzer, ausdrucksstärker und je nach Größe der Sets intern optimiert.
Das Argument muss kein echtes Set sein. Es reicht ein Set-ähnliches Objekt mit einer numerischen Eigenschaft size sowie den Methoden has() und keys(), zum Beispiel eine Map. Ob Elemente gleich sind, wird nach dem Algorithmus SameValueZero entschieden: NaN gilt als gleich NaN, Objekte werden über ihre Referenz verglichen, nicht über ihren Inhalt.
Die Reihenfolge im Ergebnis entspricht der Einfügereihenfolge von this.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $other Pflicht | Set | Map | SetLike | Das Set (oder ein Set-ähnliches Objekt mit size, has() und keys()), dessen Elemente aus dem Ergebnis ausgeschlossen werden. |
Rückgabewert
Set mit den Elementen von this, die nicht in other enthalten sind. Die Reihenfolge entspricht der Einfügereihenfolge von this.Beispiele
Einfache Differenzmenge
const primzahlen = new Set([2, 3, 5, 7, 11]);
const ungerade = new Set([1, 3, 5, 7, 9, 11]);
// Primzahlen, die nicht ungerade sind
console.log(primzahlen.difference(ungerade));
// Umgekehrt: ungerade Zahlen, die keine Primzahlen sind
console.log(ungerade.difference(primzahlen));
Fehlende Berechtigungen eines Benutzers ermitteln
const benoetigt = new Set(['lesen', 'schreiben', 'loeschen']);
const benutzerRechte = new Set(['lesen', 'kommentieren']);
const fehlend = benoetigt.difference(benutzerRechte);
if (fehlend.size > 0) {
console.log(`Zugriff verweigert, fehlend: ${[...fehlend].join(', ')}`);
}
Neue Datensätze gegenüber dem letzten Abruf finden
const ladeIds = async (url) => {
const res = await fetch(url);
const daten = await res.json();
return new Set(daten.map((e) => e.id));
};
const bekannt = new Set([101, 102, 103]);
const aktuell = new Set([102, 103, 104, 105]); // z. B. await ladeIds('/api/items')
const neu = aktuell.difference(bekannt);
const entfernt = bekannt.difference(aktuell);
console.log('Neu:', [...neu]);
console.log('Entfernt:', [...entfernt]);
Map als Set-ähnliches Argument
const produkte = new Set(['apfel', 'birne', 'kiwi', 'mango']);
const ausverkauft = new Map([
['kiwi', { seit: '2024-05-01' }],
['mango', { seit: '2024-05-03' }]
]);
// Map hat size, has() und keys() und wird über ihre Schlüssel verglichen
console.log(produkte.difference(ausverkauft));
// Wichtig · Fallstricke
- Kompatibilität: Die Methode ist erst seit 2024 in allen gängigen Browsern verfügbar (Chrome/Edge 122, Firefox 127, Safari 17) und in Node.js ab Version 22. Für ältere Umgebungen braucht man ein Polyfill, etwa aus
core-js, oder die Variantenew Set([...a].filter(x => !b.has(x))). - Arrays sind nicht erlaubt:
set.difference([1, 2])wirft einenTypeError, weil Arrays wedersizenochhas()haben. Wandle sie vorher mitnew Set(array)um. - Die Reihenfolge der Operanden zählt:
a.difference(b)ist nicht dasselbe wieb.difference(a). Wer die Elemente sucht, die nur in genau einem der beiden Sets vorkommen, verwendetsymmetricDifference(). - Objekte werden über die Referenz verglichen:
{ id: 1 }und ein zweites Objekt{ id: 1 }gelten als verschieden. Vergleiche deshalb besser über primitive Schlüssel wie IDs. - Set-ähnliche Objekte: Ist
sizekeine Zahl (zum BeispielNaNoderundefined) oder fehlenhasbzw.keys, wird einTypeErrorgeworfen. Je nachdem, welches Set größer ist, ruft die Engine intern entwederother.has()oderother.keys()auf. Diese Methoden sollten deshalb keine Seiteneffekte haben. - Das Ergebnis ist immer ein einfaches
Set, auch wennthiseine Unterklasse vonSetist.