Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. JavaScript
  3. Référence
  4. Objets natifs standards
  5. Map

Cette page a été traduite à partir de l'anglais par la communauté.Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.

View in EnglishAlways switch to English

Map

Baseline Widely available *

Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis ⁨juillet 2015⁩.

* Certaines parties de cette fonctionnalité peuvent bénéficier de prise en charge variables.

Un objetMap contient des paires de clé-valeur et mémorise l'ordre dans lequel les clés ont été insérées. N'importe quel type de valeur (primitive ou objet) peut être utilisée comme clé ou comme valeur.

Exemple interactif

const map1 = new Map();map1.set("a", 1);map1.set("b", 2);map1.set("c", 3);console.log(map1.get("a"));// Expected output: 1map1.set("a", 97);console.log(map1.get("a"));// Expected output: 97console.log(map1.size);// Expected output: 3map1.delete("b");console.log(map1.size);// Expected output: 2

Description

Un objetMap permet de parcourir ses éléments selon leur ordre d'insertion. Par exemple, une bouclefor…of renverra un tableau[clé, valeur] pour chaque itération.

Égalité des clés

  • L'égalité des clés est testée avec l'algorithme basé sursameValueZero
  • NaN est considéré égal àNaN (bien que pour l'égalité stricte, on aNaN !== NaN) et toutes les autres valeurs sont considérées égales au sens de l'égalité stricte (l'opérateur===).
  • Dans la version actuelle de la spécification ECMAScript,-0 et+0 sont considérées égaux même si ce n'était pas le cas dans les brouillons antérieurs. Voirle tableau de compatibilité pour plus de détails.

Comparaison entre objets etMap

Lesstructures objets sont similaires aux structuresMap, chacune permet d'associer des clés à des valeurs, de récupérer ces valeurs, de supprimer des clés, de détecter si une valeur est associée à une clé. Aussi, avant l'apparition deMap, on utilisait les objets pour représenter cette structure.

Toutefois, il existe des différences importantes qui font queMap se démarque et peut être préférable dans certains cas :

`Map`Objet
Clés accidentellesUn objetMap ne contient aucune clé par défaut. Il ne contient que ce qui y est explicitement placé.

Un objetObject possède un prototype et dispose donc de certaines clés par défaut, ce qui peut être source de collision avec vos propres clés si vous ne faites pas attention.

Note : Avec ES5, il est possible de contourner ceci en utilisantObject.create(null).

Types de clésPour une structureMap, les clés peuvent être n'importe quelle valeur (y compris des fonctions, des objets ou des valeurs primitives).Les clés d'une structureObject doivent être une chaîne de caractères (String) ou un symbole (Symbol).
Ordre des clésLes clés d'une structureMap sont triées selon leur ordre d'insertion.

Bien que les clés d'une structureObject soient désormais triées, ça n'a pas toujours été le cas et l'ordre en question est complexe. Aussi, mieux vaut ne pas utiliser cet ordre des propriétés.

L'ordre des propriétés propres d'un objet a été défini pour la première fois avec ECMAScript 2015. ECMAScript 2020 a défini l'ordre des propriétés héritées. Voir les opérations abstraitesOrdinaryOwnPropertyKeys etEnumerateObjectProperties qui sont décrites dans la spécification. On notera toutefois qu'aucun mécanisme ne parcourttoutes les propriétés d'un objet ; chaque mécanisme d'itération porte sur différents ensembles de propriétés :for…in ne porte que sur les propriétés énumérables dont les clés sont des chaînes de caractères,Object.keys() ne porte que sur les propriétés propres, énumérables et dont les clés sont des chaînes de caractères,Object.getOwnPropertyNames() ne porte que sur les propriétés propres dont les clés sont des chaînes de caractères, y compris celles qui ne sont pas énumérables, etObject.getOwnPropertySymbols() porte de la même façon sur les propriétés dont les clés sont des symboles.

TailleLe nombre d'éléments d'une structureMap est facilement accessible avec la propriétésize.Le nombre d'éléments d'une structureObject doit être déterminé manuellement.
ItérationUne structureMap est unitérable, et on peut donc le parcourir directement.

Object n'implémente pas deprotocole d'itération, et les objets ne peuvent donc pas être parcourus directement avec une bouclefor…of (par défaut).

Note :

  • Il est possible d'implémenter manuellement le protocole d'itération ou d'obtenir un itérable avecObject.keys() ouObject.entries().
  • L'instructionfor…in permet de parcourir les propriétésenumérables d'un objet.
PerformanceMeilleures performances pour les utilisations avec de nombreuses additions/suppressions de clés/valeurs.Pas d'optimisation pour les utilisations avec de nombreuses additions/suppressions de clés/valeurs.
Sérialisation et désérialisation

Pas de prise en charge native pour la sérialisation ou la désérialisation.

Il est toutefois possible de construire soi-même un mécanisme de sérialisation/désérialisation pourMap grâce à la fonctionJSON.stringify() et son argument de remplacement et grâce à la fonctionJSON.parse() et son argument de régénération. Voirla question StackOverflow (en anglais) sur la transformation en chaîne de caractères d'une structureMap.

JSON.stringify() permet la prise en charge native de la sérialisation des structuresObject en JSON.

JSON.parse() permet la prise en charge native de la désérialisation des structuresObject en JSON.

Ajouter des propriétés objet

Les structuresMap sont également des objets et il est donc possible de leur rajouter des propriétés objets. Attention toutefois, car cela peut être source de confusion.

Ainsi, on pourra faire :

js
const mauvaiseMap = new Map();mauvaiseMap["bla"] = "blaa";mauvaiseMap["bla2"] = "blaaa2";console.log(mauvaiseMap); // Map { bla: 'blaa', bla2: 'blaaa2' }

Mais ces instructions n'interagissent pas avec la structureMap, elles ne font qu'ajouter des propriétés objet. La valeur associée à la clé"bla" n'est pas stockée dans laMap. Ainsi, si on utilise les méthodes deMap, cela échouera :

js
mauvaiseMap.has('bla');    // falsemauvaiseMap.delete('bla'); // falseconsole.log(mauvaiseMap),  // Map { bla: 'blaa', bla2: 'blaaa2' }

Pour stocker des données dans une structureMap, on utilisera plutôt la méthodeset(cle, valeur).

js
const contacts = new Map();contacts.set("Jessie", {  phone: "01 99 00 12 34",  address: "1 Rue de l'avenue",});contacts.has("Jessie"); // truecontacts.get("James"); // undefinedcontacts.set("James", { phone: "06 39 98 78 89", address: "3 Chemin du Parc" });contacts.get("Jessie"); // {phone: "01 99 00 12 34", address: "1 Rue de l'avenue"}contacts.delete("Miaouss"); // falsecontacts.delete("Jessie"); // trueconsole.log(contacts.size); // 1

Constructeur

Map()

Crée un nouvel objetMap.

Propriétés statiques

get Map[@@species]

La fonction de construction utilisée pour créer les objets dérivés.

Propriétés des instances

Map.prototype.size

Renvoie le nombre de paires clé/valeur contenues dans l'objetMap.

Méthodes des instances

Map.prototype.clear()

Supprime toutes les paires de clé/valeur de l'objetMap.

Map.prototype.delete(var>cle</var>)

Renvoietrue si un élément existait dans l'objetMap et qu'il a été retiré, oufalse si l'élément n'existe pas. Après cette opération,Map.prototype.has(cle) renverrafalse.

Map.prototype.get(<var>cle</var>)

Renvoie la valeur associée à la clé passée en argument, ouundefined s'il n'y a pas de valeur pour cette clé.

Map.prototype.has(<var>cle</var>)

Renvoie un booléen indiquant s'il existe une valeur associée à la clé fournie par l'argument dans l'objetMap.

Map.prototype.set(<var>cle</var>, <var>valeur</var>)

Définit une valeur pour la clé, indiquées par les arguments. Renvoie l'objetMap à jour.

Méthodes d'itération

Map.prototype[@@iterator]()

Renvoie un nouvel objet itérateur qui contientun tableau de[cle, valeur] pour chaque élément de l'objetMap, dans leur ordre d'insertion.

Map.prototype.keys()

Renvoie un nouvel objet itérateur qui contient lesclés pour chaque élément de l'objetMap, dans leur ordre d'insertion.

Map.prototype.values()

Renvoie un nouvel objet itérateur qui contient lesvaleurs pour chaque élément de l'objetMap, dans leur ordre d'insertion.

Map.prototype.entries()

Renvoie un nouvel objet itérateur qui contientun tableau de[cle, valeur] pour chaque élément de l'objetMap, dans leur ordre d'insertion.

Map.prototype.forEach(<var>fnRappel</var>[,<var>thisArg</var>])

Appelle la fonctionfnRappel une fois pour chaque paire clé/valeur contenue dans l'objetMap, dans leur ordre d'insertion. Si un paramètrethisArg est fourni àforEach(), sa valeur sera utilisée comme valeur pourthis lors de chaque appel.

Exemples

Utiliser un objetMap

js
const maMap = new Map();const objectKey = {},  functionKey = function () {},  stringKey = "une chaîne";// définir les valeursmaMap.set(stringKey, "valeur associée à 'une chaîne'");maMap.set(objectKey, "valeur associée à objectKey");maMap.set(functionKey, "valeur associée à functionKey");maMap.size; // 3// récupérer les valeursmaMap.get(stringKey); // "valeur associée à 'une chaîne'"maMap.get(objectKey); // "valeur associée à objetClé"maMap.get(functionKey); // "valeur associée à fonctionClé"maMap.get("une chaîne"); // "valeur associée à 'une chaîne'"// car chaineClé === 'une chaîne'maMap.get({}); // indéfini car objetClé !== {}maMap.get(function () {}); // indéfini car fonctionClé !== function () {}

UtiliserNaN comme clé

NaN peut être utilisé comme une clé. Bien queNaN ne soit pas strictement égal à lui-même (NaN !== NaN vauttrue), on peut bâtir l'exemple suivant, car on ne peut pas distinguer deux valeursNaN :

js
const maMap = new Map();maMap.set(NaN, "not a number");maMap.get(NaN); // "not a number"const otherNaN = Number("toto");maMap.get(otherNaN); // "not a number"

Parcourir des objetsMaps avecfor…of

Il est possible de parcourir les objetsMap grâce à des bouclesfor…of :

js
const maMap = new Map();maMap.set(0, "zéro");maMap.set(1, "un");for (const [key, value] of maMap) {  console.log(`${key} = ${value}`);}// "0 = zéro"// "1 = un"for (const key of maMap.keys()) {  console.log(key);}// 0// 1for (const value of maMap.values()) {  console.log(valeur);}// zéro// unfor (const [key, value] of maMap.entries()) {  console.log(`${key} = ${value}`);}// 0 = zéro// 1 = un

Parcourir des objetsMap avecforEach()

Il est aussi possible de parcourir des objetsMap avec la méthodeforEach() :

js
maMap.forEach(function (value, key) {  console.log(`${key} = ${value}`);});// 0 = zéro// 1 = un

Relation avec les objetsArray

js
const keyValuePair = [  ["clé1", "valeur1"],  ["clé2", "valeur2"],];// On utilise le constructeur Map// pour transformer un tableau de clés/valeurs// en un objet Mapconst maMap = new Map(keyValuePair);maMap.get("clé1"); // renvoie "valeur1"// On utilise la fonction Array.from pour transformer// une map en un tableau de clés/valeursconsole.log(Array.from(maMap)); // affichera la même chose que tableauCléValeur// Avec une méthode plus concise grâce à la décompositionconsole.log([...maMap]);// On peut aussi l'utiliser pour n'extraire que les clés// ou les valeurs et créer le tableau associéconsole.log(Array.from(maMap.keys())); // affichera ["clé1", "clé2"]

Cloner et fusionner des objetsMap

Il est possible de cloner desMap comme on clone des tableaux :

js
const original = new Map([[1, "un"]]);const clone = new Map(original);console.log(clone.get(1)); // unconsole.log(original === clone); // false. Utile pour une comparaison superficielle

Note :La donnée contenue dans laMap n'est pas clonée.

Il est également possible de fusionner deuxMap en conservant le critère d'unicité sur les clés :

js
const premier = new Map([  [1, "un"],  [2, "deux"],  [3, "trois"],]);const second = new Map([  [1, "uno"],  [2, "dos"],]);// On fusionne les deux maps. C'est la "dernière" version// de la clé qui l'emporte.// L'opérateur de décomposition nous permet principalement ici// de convertir une map en un tableauconst fusion = new Map([...premier, ...second]);console.log(fusion.get(1)); // unoconsole.log(fusion.get(2)); // dosconsole.log(fusion.get(3)); // trois

Il est également possible de fusionner des objetsMap avec des objetsArray :

js
const premier = new Map([  [1, "un"],  [2, "deux"],  [3, "trois"],]);const second = new Map([  [1, "uno"],  [2, "dos"],]);// On peut fusionner des Maps avec un tableau// Là encore c'est le dernier exemplaire de la clé qui l'emporteconst fusion = new Map([...premier, ...second, [1, "eins"]]);console.log(fusion.get(1)); // einsconsole.log(fusion.get(2)); // dosconsole.log(fusion.get(3)); // trois

Spécifications

Specification
ECMAScript® 2026 Language Specification
# sec-map-objects

Compatibilité des navigateurs

Voir aussi

Help improve MDN

Learn how to contribute

Cette page a été modifiée le par lescontributeurs du MDN.


[8]ページ先頭

©2009-2025 Movatter.jp