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.
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); // 2La 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
| Point | Map | Objet |
|---|---|---|
| Clés acceptées | N'importe quelle valeur | Chaînes et symboles |
| Taille | size | Compter les clés |
| Ordre | Celui des insertions | Les entiers d'abord |
| Clés héritées | Aucune | constructor 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
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.
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
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.
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é.
À 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.