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

Set.prototype.difference()

Methode

Gibt ein neues <code>Set</code> mit allen Elementen dieses Sets zurück, die im übergebenen Set (oder Set-ähnlichen Objekt) <em>nicht</em> enthalten sind.

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

Signatur

Set.prototype.difference(other)

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

Typ
Set
Beschreibung
Ein neues 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));
Set(1) { 2 } Set(2) { 1, 9 }

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(', ')}`);
}
Zugriff verweigert, fehlend: schreiben, loeschen

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]);
Neu: [ 104, 105 ] Entfernt: [ 101 ]

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));
Set(2) { 'apfel', 'birne' }

// 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 Variante new Set([...a].filter(x => !b.has(x))).
  • Arrays sind nicht erlaubt: set.difference([1, 2]) wirft einen TypeError, weil Arrays weder size noch has() haben. Wandle sie vorher mit new Set(array) um.
  • Die Reihenfolge der Operanden zählt: a.difference(b) ist nicht dasselbe wie b.difference(a). Wer die Elemente sucht, die nur in genau einem der beiden Sets vorkommen, verwendet symmetricDifference().
  • 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 size keine Zahl (zum Beispiel NaN oder undefined) oder fehlen has bzw. keys, wird ein TypeError geworfen. Je nachdem, welches Set größer ist, ruft die Engine intern entweder other.has() oder other.keys() auf. Diese Methoden sollten deshalb keine Seiteneffekte haben.
  • Das Ergebnis ist immer ein einfaches Set, auch wenn this eine Unterklasse von Set ist.