Start · Sprachen · JavaScript · Referenz · Map.prototype.forEach()

Map.prototype.forEach()

Methode

Führt eine Callback-Funktion einmal für jedes Schlüssel/Wert-Paar einer <code>Map</code> in Einfügereihenfolge aus.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Map.prototype.forEach(callbackFn, thisArg)

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

Typ
undefined
Beschreibung
Gibt immer 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)} €`);
});
Apfel: 0.50 € Birne: 0.75 € Kiwi: 0.40 €

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);
Tastatur × 2 Maus × 1 Artikel gesamt: 3

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);
2

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
  }
});
a c d

// 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 von for (const [key, value] of map).
  • Kein Abbruch möglich: break und continue funktionieren nicht. Ein return beendet nur den aktuellen Callback-Aufruf. Für einen frühen Abbruch nutzt du for...of.
  • Kein Warten auf async: Ein async-Callback wird nicht abgewartet, denn forEach ignoriert zurückgegebene Promises. Für sequenzielles Warten verwendest du for...of mit await, für paralleles Promise.all(Array.from(map, ...)).
  • Rückgabewert: Die Methode gibt immer undefined zurück. Eine Verkettung wie map.forEach(...).filter(...) führt zu einem TypeError.
  • Ä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 WeakMap gibt es kein forEach, weil diese nicht durchlaufen werden kann.