Kurz: Neben Arrays und Objekten kennt JavaScript zwei weitere Sammlungen: Map (Schlüssel → Wert) und Set (Menge ohne Duplikate).
Teil des Kurses JavaScript
Kapitel 17 von 40 im Kurs JavaScript. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.
Neben Arrays und Objekten kennt JavaScript zwei weitere Sammlungen: Map (Schlüssel → Wert) und Set (Menge ohne Duplikate).
Set
Ein Set speichert jeden Wert höchstens einmal:
const s = new Set([1, 2, 2, 3, 3, 3]);
console.log(s, s.size);
s.add(4); s.add(2);
console.log(s.has(4), s.has(9));
s.delete(1);
console.log([...s]);
console.log([...new Set("mississippi")].join(""));Ausgabe:
Set(3) { 1, 2, 3 } 3
true false
[ 2, 3, 4 ]
mispMengenoperationen
const a = new Set([1, 2, 3, 4]), b = new Set([3, 4, 5]);
console.log([...a].filter(x => b.has(x))); // Schnittmenge
console.log([...new Set([...a, ...b])]); // Vereinigung
console.log([...a].filter(x => !b.has(x))); // DifferenzAusgabe:
[ 3, 4 ]
[ 1, 2, 3, 4, 5 ]
[ 1, 2 ]Map
Eine Map speichert Schlüssel-Wert-Paare. Anders als bei Objekten darf jeder Wert Schlüssel sein (Zahlen, Objekte, Funktionen) und die Einfügereihenfolge bleibt erhalten:
const m = new Map();
m.set("a", 1).set(2, "zwei").set(true, "ja");
console.log(m.get("a"), m.get(2), m.get(true), m.get("x"));
console.log(m.size, m.has(2));
m.delete(2);
for (const [k, v] of m) console.log(k, "->", v);
console.log([...m.keys()], [...m.values()]);
const m2 = new Map([["x", 10], ["y", 20]]);
console.log(Object.fromEntries(m2), new Map(Object.entries({ a: 1 })));Ausgabe:
1 zwei ja undefined
3 true
a -> 1
true -> ja
[ 'a', true ] [ 1, 'ja' ]
{ x: 10, y: 20 } Map(1) { 'a' => 1 }Map oder Objekt?
| Objekt | Map | |
|---|---|---|
| Schlüsseltypen | Text und Symbole | beliebig |
| Reihenfolge | meist Einfügereihenfolge | garantiert Einfügereihenfolge |
| Größe | manuell (Object.keys(o).length) | .size |
| Häufiges Hinzufügen/Löschen | langsamer | optimiert |
| JSON | direkt | Umwandlung nötig |
Für feste Datensätze ({ name, alter }) nimmst du Objekte, für dynamische Tabellen oder Zähler eine Map.
Zähler mit Map
const text = "das ist ein test das ist gut";
const zaehler = new Map();
for (const wort of text.split(" ")) zaehler.set(wort, (zaehler.get(wort) ?? 0) + 1);
console.log([...zaehler].sort((a, b) => b[1] - a[1]).slice(0, 2));
console.log(Map.groupBy([1, 2, 3, 4], n => n % 2 ? "ungerade" : "gerade"));Ausgabe:
[ [ 'das', 2 ], [ 'ist', 2 ] ]
Map(2) { 'ungerade' => [ 1, 3 ], 'gerade' => [ 2, 4 ] }Objekte als Schlüssel
const schluessel = { id: 1 };
const m = new Map([[schluessel, "Daten"]]);
console.log(m.get(schluessel), m.get({ id: 1 })); // zweites Objekt ist ein anderesAusgabe:
Daten undefinedWeakMap und WeakSet
WeakMap und WeakSet halten Objekte nur schwach: Wird das Objekt sonst nirgends benutzt, räumt der Speicher-Aufräumer es weg. Sie eignen sich für Zusatzdaten zu Objekten, ohne Speicherlecks zu verursachen. Man kann sie nicht durchlaufen.
const privat = new WeakMap();
class Konto {
constructor(stand) { privat.set(this, { stand }); }
get stand() { return privat.get(this).stand; }
}
console.log(new Konto(100).stand);Ausgabe:
100Merke
Set: Menge ohne Duplikate (add,has,delete,size)Map: Schlüssel-Wert mit beliebigen Schlüsseln, behält die Reihenfolge- Duplikate entfernen:
[...new Set(array)] WeakMap/WeakSet: schwache Verweise ohne Speicherlecks- Mit Maps kannst du Zähler und Gruppierungen sauber bauen
Übungsaufgabe
Entferne Duplikate aus [3, 1, 3, 2, 1] mit einem Set und zähle, wie oft jedes Zeichen in “banane” vorkommt, mit einer Map.
Quiz zur Selbstkontrolle
Wie entfernst du Duplikate aus einem Array?
- […new Set(array)] (richtig)
- array.unique()
- array.dedupe
- new Map(array)
Was kann bei einer Map Schlüssel sein?
- Jeder Wert, auch Objekte (richtig)
- Nur Strings
- Nur Zahlen
- Nur Strings und Zahlen
)?
- 2 (richtig)
- 3
- 1
- 0
Weiter im Kurs
Zurück: Destructuring, Spread und Rest
Weiter: JSON
Alle Kapitel: JavaScript im Überblick