Map en JavaScript : associer une valeur à n'importe quelle clé

Map associe des valeurs à des clés de tout type, conserve l'ordre d'insertion et connaît sa taille : ce qu'elle apporte face à un objet ordinaire.
3 min de lecture
Believemy logo

Un objet JavaScript sert de dictionnaire depuis toujours, et cela tient tant que les clés sont des chaînes. Le jour où il faut associer une donnée à une date, à un élément de la page ou à un autre objet, il ne suit plus.

Map est la structure prévue pour ce travail : une collection de paires clé-valeur où la clé peut être n'importe quoi.


Définition

Une Map est une collection ordonnée de paires clé-valeur. Contrairement à un Object (objet), elle accepte n'importe quelle valeur comme clé, conserve l'ordre d'insertion et expose sa taille directement.

JAVASCRIPT
const paniers = new Map();
const client = { id: 7 };

paniers.set(client, ["clavier"]);
paniers.set("total", 89);

console.log(paniers.get(client));    // [ 'clavier' ]
console.log(paniers.has("total"));   // true
console.log(paniers.size);           // 2

La clé client est un objet, et c'est cet objet précis qui sert de clé : une copie portant les mêmes propriétés ne retrouverait rien. Les méthodes utiles tiennent en cinq noms : set, get, has, delete, clear.


Face à un objet ordinaire

PointMapObjet
Clés acceptéesN'importe quelle valeurChaînes et symboles
TaillesizeCompter les clés
OrdreCelui des insertionsLes entiers d'abord
Clés héritéesAucuneconstructor et compagnie

La dernière ligne compte plus qu'il n'y paraît. Sur un objet ordinaire, "constructor" in donnees vaut true alors que personne n'a écrit cette clé, ce qui suffit à fausser un test d'appartenance sur des clés venues de l'extérieur. Une Map ne connaît que ce qu'on y a mis.


Parcourir et convertir

JAVASCRIPT
const stock = new Map([
  ["clavier", 12],
  ["souris", 0],
]);

for (const [article, quantite] of stock) {
  console.log(article, quantite);
}

console.log([...stock.keys()]);            // [ 'clavier', 'souris' ]
console.log(JSON.stringify(stock));        // {}
console.log(JSON.stringify([...stock]));   // [["clavier",12],["souris",0]]

Une Map se parcourt directement avec of, chaque tour livrant une paire prête à être décomposée par Destructuration.

Attention

L'avant-dernière ligne est le piège classique : JSON ne connaît pas les Map et sérialise un objet vide, sans le moindre avertissement. Il faut passer par un tableau de paires, avec Spread (...) ou Array.from.


Questions fréquentes

Question

Quand garder un objet ordinaire ?

Dès que les clés sont connues à l'avance et peu nombreuses, comme un enregistrement à quatre champs. L'objet se décompose, se sérialise en JSON sans effort et se lit mieux. La Map devient intéressante quand les clés arrivent à l'exécution ou ne sont pas des chaînes.

Question

Les clés sont-elles comparées comme avec === ?

Presque. La comparaison utilisée traite NaN comme égal à lui-même, ce que refuse l'Égalité stricte (===) : une clé NaN est donc retrouvable. Seule autre différence, -0 et 0 sont considérés comme la même clé.

Question

À quoi sert une WeakMap ?

À attacher des données à des objets sans les empêcher d'être libérés de la mémoire. Ses clés sont forcément des objets et ne se parcourent pas. C'est l'outil des caches associés à un élément de page, qui disparaissent avec lui.

Termes connexes

Découvrez notre glossaire JavaScript

Tous les mots de JavaScript expliqués simplement : mots-clés, objets natifs, méthodes, erreurs et concepts. Définitions claires et exemples qui tournent, pour apprendre et pour se dépanner.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.