JavaScript Map : stockage et recherche clé-valeur
Un objet JavaScript Map stocke des paires clé-valeur et permet d’utiliser n’importe quelle valeur comme clé : objets, fonctions ou primitives. Utilisez-le quand vous avez besoin d’itérer dans l’ordre d’insertion, d’utiliser des clés non textuelles, ou d’ajouter et supprimer des entrées fréquemment. Contrairement aux objets simples, les clés d’un Map ne sont pas affectées par les propriétés héritées du prototype, ce qui évite des surprises avec des clés dynamiques.
Exemple JavaScript Map pour le stockage clé-valeur
Sortie :
La sortie apparaîtra ici...
Sortie :
95
false
2
Comment cet exemple fonctionne
new Map()crée une map vide. AppelerMap()sansnewdéclenche uneTypeError.setajoute une paire clé-valeur et renvoie l’instanceMap, ce qui permet d’enchaîner les appels commemap.set("a", 1).set("b", 2). Appelersetavec une clé existante écrase la valeur sans modifier la position d’itération de cette clé.getrenvoie la valeur stockée, ouundefinedsi la clé est absente. Utilisezhaspour distinguer une clé manquante d’une clé explicitement définie àundefined.sizereflète le nombre actuel d’entrées, contrairement aux objets qui nécessitentObject.keys(obj).length.
Erreurs courantes avec JavaScript Map
Utiliser la syntaxe entre crochets au lieu de set/get :
Faux :
const map = new Map();
map["clé"] = "valeur";
console.log(map.get("clé")); // undefined
Correct :
const map = new Map();
map.set("clé", "valeur");
console.log(map.get("clé")); // "valeur"
La syntaxe entre crochets définit une propriété d’objet sur l’instance Map, pas une entrée de Map. get, has et size l’ignorent.
Attendre une égalité structurelle pour les clés objet :
Faux :
const map = new Map();
map.set({id: 1}, "alice");
console.log(map.get({id: 1})); // undefined
Correct :
const cle = {id: 1};
map.set(cle, "alice");
console.log(map.get(cle)); // "alice"
Map utilise SameValueZero pour l’égalité des clés. Pour les objets, cela signifie identité par référence : deux littéraux d’objet visuellement identiques restent deux clés différentes.
JavaScript Map vs objet
Map | Objet | |
|---|---|---|
| Types de clés | Toute valeur (objets, fonctions, primitives) | Chaînes et symboles uniquement |
| Ordre d’itération | Ordre d’insertion (garanti) | Principalement l’ordre d’insertion, mais les clés de type entier sont triées en premier |
| Taille | map.size | Object.keys(obj).length |
| Collisions de prototype | Aucune | Les clés peuvent masquer toString, constructor, etc. |
| Sérialisation JSON | Manuelle via Object.fromEntries | JSON.stringify intégré |
Utilisez Map quand les clés ne sont pas des chaînes, quand les entrées sont ajoutées et supprimées souvent, ou quand vous stockez des clés non fiables. Utilisez un objet simple pour des enregistrements à structure fixe ou des données qui doivent être sérialisées en JSON.
Si vous avez besoin d’un objet tout en évitant les collisions de clés du prototype, utilisez Object.create(null) comme objet sous-jacent.
FAQ
JavaScript Map préserve-t-il l’ordre d’insertion ?
Oui. Map itère les entrées dans l’ordre de leur première insertion. set() sur une clé existante met à jour la valeur mais garde la position d’origine. Supprimer une clé puis la réajouter la déplace à la fin.
JavaScript Map peut-il utiliser des objets comme clés ?
Oui, mais Map compare les clés objet par référence, pas par structure. Deux objets différents avec les mêmes propriétés sont traités comme des clés distinctes. Stockez la référence dans une variable et utilisez cette même référence pour set et get.
Comment convertir un JavaScript Map en objet ou en JSON ?
Appelez Object.fromEntries(map) pour créer un objet simple : cela fonctionne quand toutes les clés sont des chaînes ou des symboles. Pour des clés non textuelles, sérialisez le tableau d’entrées : JSON.stringify([...map]).
Quelle différence entre JavaScript Map et la fonction JavaScript map() ?
Map est une collection clé-valeur pour stocker et récupérer des données. La fonction JavaScript map() (Array.prototype.map) est une méthode de tableau qui renvoie un nouveau tableau en appliquant un callback à chaque élément. Ils partagent le même nom, mais servent des objectifs différents.