Signatur
Beschreibung
Map.prototype.forEach() durchläuft alle Einträge einer Map in der Reihenfolge, in der sie eingefügt wurden, und ruft für jeden Eintrag die übergebene Funktion auf. Der Callback erhält die Argumente in der Reihenfolge (value, key, map). Zuerst kommt also der Wert, dann der Schlüssel. Damit ist die Signatur einheitlich mit Array.prototype.forEach(), wo ebenfalls zuerst das Element und dann der Index kommt.
Die Methode eignet sich für Nebenwirkungen wie Logging, DOM-Aktualisierungen oder das Befüllen anderer Datenstrukturen. Sie gibt immer undefined zurück und lässt sich daher nicht verketten. Brauchst du eine Transformation, z. B. eine neue Map oder ein Array, ist Array.from(map, ...) oder ein Aufruf von map() auf map.entries() (Iterator-Helfer, ES2025) meist besser geeignet.
Einträge, die während des Durchlaufs hinzugefügt werden, werden noch besucht, sofern der Durchlauf sie erreicht. Einträge, die vor ihrem Besuch gelöscht werden, werden übersprungen. Einen Wert, der bereits besucht wurde, erneut zu setzen, löst keinen zweiten Aufruf aus. Ein vorzeitiger Abbruch mit break ist nicht möglich. Dafür verwendest du for...of.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $callbackFn Pflicht | (value: any, key: any, map: Map) => void | Funktion, die für jeden Eintrag aufgerufen wird. Sie erhält value (den Wert des Eintrags), key (den Schlüssel) und map (die durchlaufene Map). Ihr Rückgabewert wird ignoriert. |
|
| $thisArg | any | undefined | Wert, der beim Aufruf von callbackFn als this verwendet wird. Bei Pfeilfunktionen hat er keine Wirkung, weil diese this lexikalisch binden. |
Rückgabewert
undefined zurück. Die Methode ist daher nicht verkettbar.Beispiele
Einträge einer Map ausgeben
const preise = new Map([
['Apfel', 0.5],
['Birne', 0.75],
['Kiwi', 0.4]
]);
// Achtung: zuerst der Wert, dann der Schlüssel
preise.forEach((preis, frucht) => {
console.log(`${frucht}: ${preis.toFixed(2)} €`);
});
Summe und Objekt-Schlüssel verarbeiten
const warenkorb = new Map();
warenkorb.set({ id: 1, name: 'Tastatur' }, 2);
warenkorb.set({ id: 2, name: 'Maus' }, 1);
let anzahl = 0;
warenkorb.forEach((menge, artikel) => {
console.log(`${artikel.name} × ${menge}`);
anzahl += menge;
});
console.log('Artikel gesamt:', anzahl);
thisArg mit einer normalen Funktion nutzen
const zaehler = {
treffer: 0,
schwelle: 50
};
const punkte = new Map([['Anna', 72], ['Ben', 45], ['Cem', 90]]);
// thisArg wirkt nur bei function-Ausdrücken, nicht bei Pfeilfunktionen
punkte.forEach(function (wert) {
if (wert >= this.schwelle) this.treffer++;
}, zaehler);
console.log(zaehler.treffer);
Map während des Durchlaufs verändern
const m = new Map([['a', 1], ['b', 2], ['c', 3]]);
m.forEach((wert, key, map) => {
console.log(key);
if (key === 'a') {
map.delete('b'); // wird übersprungen
map.set('d', 4); // wird noch besucht
}
});
// Wichtig · Fallstricke
- Reihenfolge der Argumente: Der Callback erhält
(value, key)und nicht(key, value). Das ist ein häufiger Fehler, vor allem beim Umstieg vonfor (const [key, value] of map). - Kein Abbruch möglich:
breakundcontinuefunktionieren nicht. Einreturnbeendet nur den aktuellen Callback-Aufruf. Für einen frühen Abbruch nutzt dufor...of. - Kein Warten auf async: Ein
async-Callback wird nicht abgewartet, dennforEachignoriert zurückgegebene Promises. Für sequenzielles Warten verwendest dufor...ofmitawait, für parallelesPromise.all(Array.from(map, ...)). - Rückgabewert: Die Methode gibt immer
undefinedzurück. Eine Verkettung wiemap.forEach(...).filter(...)führt zu einemTypeError. - Änderungen während des Durchlaufs: Neu hinzugefügte Einträge werden besucht, gelöschte und noch nicht besuchte Einträge werden übersprungen. Wenn der Callback ständig neue Einträge anlegt, entsteht eine Endlosschleife.
- Kompatibilität: Die Methode wird seit ES2015 von allen modernen Browsern und von Node.js unterstützt. Bei
WeakMapgibt es keinforEach, weil diese nicht durchlaufen werden kann.