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

Map.prototype.delete()

Methode

Entfernt den Eintrag mit dem angegebenen Schlüssel aus einer <code>Map</code> und gibt zurück, ob ein Eintrag gelöscht wurde.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Map.prototype.delete(key)

Beschreibung

Die Methode delete() entfernt den Eintrag mit dem Schlüssel key aus der Map. Gab es den Schlüssel, liefert sie true. Gab es ihn nicht, liefert sie false und die Map bleibt unverändert. Deshalb braucht man vor dem Löschen kein has(): Der Rückgabewert zeigt bereits, ob etwas entfernt wurde.

Schlüssel werden nach dem Algorithmus SameValueZero verglichen. Primitive Werte wie Zeichenketten und Zahlen werden nach ihrem Wert verglichen. NaN gilt als gleich NaN, und +0 und -0 gelten als derselbe Schlüssel. Objekte, Arrays und Funktionen werden dagegen nach ihrer Identität verglichen: Zum Löschen braucht man genau dieselbe Referenz, die beim set() benutzt wurde.

Typische Einsatzfälle sind Caches, in denen abgelaufene Einträge entfernt werden, Listen aktiver Verbindungen oder Sitzungen und Zuordnungen von DOM-Elementen oder IDs zu Zustandsdaten. Wenn Einträge häufig hinzugefügt und entfernt werden, ist Map mit delete() meist besser geeignet als ein einfaches Objekt mit dem delete-Operator.

Parameter

Name Typ Default Beschreibung
$key Pflicht any Der Schlüssel des Eintrags, der entfernt werden soll. Verglichen wird nach SameValueZero, Objekte also nach ihrer Referenz.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn ein Eintrag im Map-Objekt erfolgreich entfernt wurde. false, wenn der Schlüssel in der Map nicht gefunden wurde.

Beispiele

Eintrag löschen und Rückgabewert prüfen

const lager = new Map([
  ['äpfel', 12],
  ['birnen', 5]
]);

console.log(lager.delete('äpfel'));  // vorhanden
console.log(lager.delete('kirschen')); // nicht vorhanden
console.log(lager.has('äpfel'));
console.log(lager.size);
true false false 1

Abgelaufene Einträge aus einem Cache entfernen

const cache = new Map();

const setzen = (schluessel, wert, ttlMs) => {
  cache.set(schluessel, { wert, ablauf: Date.now() + ttlMs });
};

const aufraeumen = () => {
  const jetzt = Date.now();
  // Löschen während der Iteration ist bei Map sicher
  for (const [schluessel, eintrag] of cache) {
    if (eintrag.ablauf <= jetzt) cache.delete(schluessel);
  }
};

setzen('user:1', { name: 'Anna' }, -1);   // bereits abgelaufen
setzen('user:2', { name: 'Ben' }, 60_000);
aufraeumen();
console.log([...cache.keys()]);
[ 'user:2' ]

Objekt-Schlüssel: nur dieselbe Referenz löscht den Eintrag

const sitzungen = new Map();
const client = { id: 42 };

sitzungen.set(client, { verbunden: new Date() });

// Ein neues Objekt mit gleichem Inhalt ist ein anderer Schlüssel
console.log(sitzungen.delete({ id: 42 }));
console.log(sitzungen.delete(client));
console.log(sitzungen.size);
false true 0

Sonderfälle NaN und -0

const m = new Map([[NaN, 'keine Zahl'], [0, 'null']]);

console.log(m.delete(NaN)); // NaN gilt als gleich NaN
console.log(m.delete(-0));  // -0 und +0 sind derselbe Schlüssel
console.log(m.size);
true true 0

// Wichtig · Fallstricke

  • Nicht mit dem delete-Operator verwechseln: delete map[key] entfernt keinen Eintrag aus der Map. Der Operator wirkt nur auf Eigenschaften des Objekts selbst. Verwende immer map.delete(key).
  • Referenzvergleich bei Objekten: Ein neu erzeugtes Objekt mit gleichem Inhalt passt nicht zum gespeicherten Schlüssel. Bewahre deshalb die ursprüngliche Referenz auf oder nimm primitive Schlüssel wie IDs.
  • Löschen während der Iteration mit for...of oder forEach() ist erlaubt und sicher. Bereits gelöschte Einträge, die noch nicht erreicht wurden, werden dann nicht mehr besucht.
  • Nicht verkettbar: Anders als set() gibt delete() einen boolean zurück und nicht die Map. map.delete(a).delete(b) funktioniert also nicht.
  • Um alle Einträge zu entfernen, ist clear() einfacher und schneller als mehrere delete()-Aufrufe.
  • Soll ein Eintrag automatisch verschwinden, wenn sein Schlüsselobjekt nicht mehr verwendet wird, ist WeakMap die bessere Wahl.
  • Kompatibilität: Wird seit ES2015 von allen modernen Browsern und Node.js unterstützt (Baseline).