JavaScript Map: Einführung in das Map-Objekt mit Beispielen

JavaScript Map: Einführung in das Map-Objekt mit Beispielen

Map ist ein Konstruktor, der in bestimmten Anwendungsfällen einfachere und effizientere Wege bietet, Daten zu strukturieren und darauf zuzugreifen. 

Was ein Map-Objekt konkret leistet, in drei Punkten:

  • Map enthält Schlüssel-Wert-Paare, wobei die Schlüssel von beliebigem Datentyp sein dürfen.

  • Map merkt sich die ursprüngliche Einfügereihenfolge der Schlüssel.

  • Map hat eine Eigenschaft, die seine Größe angibt.

Nützliche Methoden des JavaScript-Map-Objekts

  • clear() – entfernt alle Elemente aus dem Map-Objekt.
  •  delete(key) – entfernt das Element mit dem angegebenen Schlüssel. Sie gibt true zurück, wenn das Element im Map-Objekt liegt, sonst false.
  •  entries() – gibt ein neues Iterator-Objekt zurück, das für jedes Element des Map-Objekts ein Array [key, value] enthält. Die Reihenfolge der Objekte im Map-Objekt entspricht der Einfügereihenfolge.
  •  forEach(callback[, thisArg]) – ruft für jedes Schlüssel-Wert-Paar der Map einen Callback in der Einfügereihenfolge auf. Der optionale Parameter thisArg legt den Wert von this für jeden Callback fest.
  •  get(key) – gibt den Wert zum Schlüssel zurück. Existiert der Schlüssel nicht, kommt undefined zurück.
  •  has(key) – gibt true zurück, wenn zu dem Schlüssel ein Wert existiert, sonst false.
  •  keys() –  gibt einen neuen Iterator zurück, der die Schlüssel der Elemente in der Einfügereihenfolge enthält.
  •  set(key, value) – setzt den Wert des Schlüssels im Map-Objekt. Sie gibt das Map-Objekt selbst zurück, du kannst diese Methode also mit weiteren Methoden verketten.
  •  values() gibt ein neues Iterator-Objekt zurück, das die Werte aller Elemente in der Einfügereihenfolge enthält.

Beispiele für den Einsatz des JavaScript-Map-Objekts

Ein neues Map-Objekt anlegen

Angenommen, du hast folgende Liste von Nutzerobjekten:

javascript
let pierre = {name: 'Pierre Lepez'},
    jean = {name: 'Jean Doe'},
    kevin = {name: 'Kévin Gomez'};

Angenommen, du sollst daraus ein Map-Objekt aus Nutzern und Rollen aufbauen. Dafür nutzt du folgenden Code:

javascript
let userRoles = new Map();

userRoles ist eine Instanz des Map-Objekts, und sein Typ ist object, wie das folgende Beispiel zeigt:

javascript
console.log(typeof(userRoles)); // object
console.log(userRoles instanceof Map); // true

Elemente zur Map hinzufügen

Um einem Nutzer eine Rolle zuzuweisen, nimmst du die Methode set():

javascript
userRoles.set(kevin, 'admin');

Die Methode set() weist dem Nutzer kevin die Rolle des Administrators zu. Da set() verkettbar ist, sparst du dir Tipparbeit, wie dieses Beispiel zeigt:

javascript
userRoles.set(pierre, 'éditeur')
          .set(jean, 'abonné');

Ein Map-Objekt mit einem iterierbaren Objekt initialisieren

Wie oben erwähnt kannst du dem Konstruktor Map() ein iterierbares Objekt übergeben:

javascript
let userRoles = new Map([
    [kevin, 'admin'],
    [pierre, 'éditeur'],
    [jean, 'abonné']
]);

Ein Element über seinen Schlüssel abrufen

Willst du die Rollen von Kévin sehen, nimmst du die Methode get():

javascript
userRoles.get(kevin); // admin

Übergibst du einen Schlüssel, der nicht existiert, gibt get() undefined zurück.

javascript
let foo = {name: 'Foo'};
userRoles.get(foo); //undefined

Prüfen, ob ein Element zu einem Schlüssel existiert

Um zu prüfen, ob ein Schlüssel in unserem Map-Objekt vorkommt, nimmst du die Methode has().

javascript
userRoles.has(foo); // false
userRoles.has(pierre); // true

Die Anzahl der Elemente unseres Map-Objekts ermitteln

Die Eigenschaft size gibt die Anzahl der Einträge des Map-Objekts zurück.

javascript
console.log(userRoles.size); // 3

Über die Schlüssel deines Map-Objekts iterieren

Um die Schlüssel eines Map-Objekts zu bekommen, nimmst du die Methode keys(). Die Methode keys() gibt ein neues Iterator-Objekt zurück, das die Schlüssel der Elemente enthält.

Das folgende Beispiel gibt die Namen der Nutzer aus dem Map-Objekt userRoles aus.

javascript
let kevin = { name: 'Kévin Feige' },
  pierre = { name: 'Pierre Rocher' },
  jean = { name: 'Jean Moulin' };

let userRoles = new Map([
    [kevin, 'admin'],
    [pierre, 'éditeur'],
    [jean, 'abonné']
]);

for (const user of userRoles.keys()) {
  console.log(user.name);
}

Ausgabe:

javascript
Kévin Feige
Pierre Rocher
Jean Moulin

Über die Werte deines Map-Objekts iterieren

Genauso holst du dir mit der Methode values() ein Iterator-Objekt mit den Werten aller Elemente deines Map-Objekts:

javascript
let kevin = { name: 'Kévin Feige' },
  pierre = { name: 'Pierre Rocher' },
  jean = { name: 'Jean Moulin' };

let userRoles = new Map([
    [kevin, 'admin'],
    [pierre, 'éditeur'],
    [jean, 'abonné']
]);

for (const role of userRoles.values()) {
  console.log(role);
}

Ausgabe:

javascript
admin
éditeur
abonné

Über die Elemente deines Map-Objekts iterieren

Außerdem gibt die Methode entries() ein Iterator-Objekt zurück, das für jedes Element des Map-Objekts ein Array [key,value] enthält:

javascript
let kevin = { name: 'Kévin Feige' },
  pierre = { name: 'Pierre Rocher' },
  jean = { name: 'Jean Moulin' };

let userRoles = new Map([
    [kevin, 'admin'],
    [pierre, 'éditeur'],
    [jean, 'abonné']
]);

for (const role of userRoles.entries()) {
  console.log(`${role[0].name}: ${role[1]}`);
}

Damit sich die Iteration natürlicher liest, kannst du Destructuring nutzen:

javascript
let kevin = { name: 'Kévin Feige' },
  pierre = { name: 'Pierre Rocher' },
  jean = { name: 'Jean Moulin' };

let userRoles = new Map([
    [kevin, 'admin'],
    [pierre, 'éditeur'],
    [jean, 'abonné']
]);

userRoles.forEach((role, user) => console.log(`${user.name}: ${role}`));

Neben der Schleife for…of steht dir die Methode forEach() des Map-Objekts zur Verfügung:

Schlüssel oder Werte der Map in ein Array umwandeln

Manchmal willst du lieber mit einem Array als mit einem iterierbaren Objekt arbeiten. Dafür nimmst du den Spread-Operator.

Das folgende Beispiel wandelt die Schlüssel aller Elemente in ein Array von Schlüsseln um:

javascript
var keys = [...userRoles.keys()];
console.log(keys);

Ausgabe:

javascript
[ { name: 'Kévin Feige' },
  { name: 'Pierre Rocher' },
  { name: 'Jean Moulin' } ]

Und so wandelst du die Werte der Elemente in ein Array um:

javascript
let roles = [...userRoles.values()];
console.log(roles);

Ausgabe:

javascript
[ 'admin', 'éditeur', 'abonné' ]

Ein Element über seinen Schlüssel löschen

Um einen Eintrag aus deinem Map-Objekt zu entfernen, nimmst du die Methode delete().

javascript
userRoles.delete(pierre);

Alle Elemente eines Map-Objekts löschen

Um alle Einträge des Map-Objekts zu entfernen, nimmst du die Methode clear():

javascript
userRoles.clear();
console.log(userRoles.size); // 0

WeakMap

Eine WeakMap funktioniert ähnlich wie eine Map, nur müssen die Schlüssel einer WeakMap Objekte sein. Sobald keine Referenz auf einen Schlüssel (ein Objekt) mehr existiert, wird der zugehörige Wert automatisch aus dem Speicher freigegeben.

Eine WeakMap hat nur einen Teil der Methoden eines Map-Objekts:

  • get(key)
  • set(key, value)
  • has(key)
  • delete(key)

Das sind die wichtigsten Unterschiede zwischen einer Map und einer WeakMap:

  • Über die Elemente einer WeakMap lässt sich nicht iterieren.
  • Alle Elemente auf einmal löschen geht nicht.
  • Die Größe einer WeakMap lässt sich nicht abfragen.

In diesem Tutorial hast du gelernt, wie du mit dem JavaScript-Objekt Map und seinen nützlichen Methoden die Einträge des Map-Objekts verwaltest.

JavaScript

Damien Flandrin Webentwickler seit 2010, Gründer von Gekkode und Email Impact. Jeder Artikel wird vor der Veröffentlichung an einem echten Projekt getestet. Kontakt
Newsletter

Neue Tests, Tutorials und Projekte, per E-Mail.

Reproduzierbare Tests, versionierter Code, datierte Ergebnisse. Niemals Spam.