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

Set.prototype.intersection()

Methode

Gibt eine neue <code>Set</code> zurück, die nur die Elemente enthält, die sowohl in dieser Menge als auch in <code>other</code> vorkommen (Schnittmenge).

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

Signatur

Set.prototype.intersection(other)

Beschreibung

intersection() berechnet die mathematische Schnittmenge A ∩ B: Das Ergebnis enthält genau die Werte, die in beiden Mengen vorhanden sind. Die ursprüngliche Menge und das Argument bleiben unverändert, zurückgegeben wird immer eine neue Set-Instanz.

Typische Einsatzfälle sind der Abgleich von Berechtigungen (erforderliche vs. vorhandene Rechte), gemeinsame Tags, Filter oder Freundeslisten, oder das Finden überlappender IDs aus zwei Datenquellen. Bisher schrieb man dafür new Set([...a].filter(x => b.has(x))) – die native Methode ist lesbarer und in der Regel effizienter.

Das Argument muss kein echtes Set sein, sondern nur Set-ähnlich: Es braucht eine numerische Eigenschaft size sowie die Methoden has() und keys(). Damit funktionieren z. B. auch Map-Objekte (verglichen werden deren Schlüssel). Ein normales Array ist dagegen nicht Set-ähnlich und löst einen TypeError aus.

Gleichheit wird wie bei Set üblich per SameValueZero geprüft: NaN gilt als gleich NaN, Objekte werden nur per Referenz verglichen.

Parameter

Name Typ Default Beschreibung
$other Pflicht Set|Map|SetLike Die zweite Menge. Muss Set-ähnlich sein, d. h. size (Zahl), has(value) und keys() (liefert einen Iterator) besitzen.

Rückgabewert

Typ
Set
Beschreibung
Eine neue Set mit allen Elementen, die sowohl in this als auch in other enthalten sind. Ist die Schnittmenge leer, wird eine leere Set zurückgegeben.

Beispiele

Einfache Schnittmenge zweier Zahlenmengen

const ungerade = new Set([1, 3, 5, 7, 9]);
const primzahlen = new Set([2, 3, 5, 7]);

const beides = ungerade.intersection(primzahlen);
console.log(beides);
console.log(beides.size);
Set(3) { 3, 5, 7 } 3

Berechtigungen prüfen: welche erforderlichen Rechte hat der Nutzer?

const erforderlich = new Set(['read', 'write', 'delete']);
const nutzerRechte = new Set(['read', 'write', 'share']);

const vorhanden = erforderlich.intersection(nutzerRechte);
const vollstaendig = vorhanden.size === erforderlich.size;

console.log([...vorhanden]);
console.log(vollstaendig ? 'Zugriff erlaubt' : 'Zugriff verweigert');
[ 'read', 'write' ] Zugriff verweigert

Map als Set-ähnliches Argument – gemeinsame IDs finden

const warenkorbIds = new Set([101, 205, 309, 412]);

// Map: Produkt-ID -> Rabatt in Prozent
const rabatte = new Map([
  [205, 10],
  [412, 25],
  [999, 5],
]);

// Verglichen werden die Schlüssel der Map
const rabattiert = warenkorbIds.intersection(rabatte);
for (const id of rabattiert) {
  console.log(`Produkt ${id}: ${rabatte.get(id)} % Rabatt`);
}
Produkt 205: 10 % Rabatt Produkt 412: 25 % Rabatt

Arrays vorher in ein Set umwandeln

const tagsA = ['js', 'css', 'html', 'node'];
const tagsB = ['node', 'deno', 'js'];

// tagsB direkt zu übergeben würde einen TypeError auslösen
const gemeinsam = new Set(tagsA).intersection(new Set(tagsB));
console.log([...gemeinsam].sort());
[ 'js', 'node' ]

// Wichtig · Fallstricke

  • Reihenfolge nicht garantiert wie erwartet: Aus Effizienzgründen iteriert die Engine über die kleinere Menge. Ist this.size > other.size, folgt das Ergebnis der Reihenfolge von other.keys(). Verlassen Sie sich daher nicht auf die Einfügereihenfolge, sondern sortieren Sie bei Bedarf.
  • Keine Arrays als Argument: set.intersection([1, 2]) wirft einen TypeError, weil Arrays kein size und kein has() besitzen. Vorher new Set(array) verwenden.
  • Ungültiges size: Ist other.size undefined oder NaN, wird ein TypeError ausgelöst; ein negatives size führt zu einem RangeError.
  • Objektvergleich per Referenz: Zwei inhaltsgleiche Objekte wie {id: 1} gelten als verschieden. Für Datensätze besser primitive Schlüssel (IDs) in die Mengen legen.
  • Kompatibilität: Neu seit ES2025 (Baseline seit Juni 2024). In älteren Browsern und Node.js < 22 nicht vorhanden – dort Polyfill (z. B. core-js) oder den Fallback new Set([...a].filter(x => b.has(x))) nutzen. Verfügbarkeit prüfen mit typeof Set.prototype.intersection === 'function'.