Objet Map

Les objets Map contiennent des paires clé-valeur. N'importe quelle valeur (un objet ou une valeur primitive) peut être utilisée comme clé ou comme valeur.

Différence entre les Maps et les Objects

  • Les clés d'un Object ne peuvent être que des chaînes de caractères ou des Symbols, mais les clés d'un Map peuvent être n'importe quelle valeur.
  • Les paires clé-valeur dans un Map sont ordonnées (principe FIFO), alors que les clés ajoutées à un objet ne le sont pas.
  • Le nombre de paires clé-valeur dans une Map peut être obtenu à partir de la propriété size, tandis que le nombre dans un Object ne peut être calculé que manuellement.
  • Les objets ont leur propre prototype, et les noms de clés sur la chaîne de prototypes peuvent entrer en conflit avec les noms de clés que vous définissez sur l'objet.

Clé dans une Map

La clé est une chaîne de caractères

var myMap = new Map(); var keyString = "a string"; myMap.set(keyString, "The value associated with the key 'a string'"); myMap.get(keyString); //"The value associated with the key 'a string'" myMap.get("a string"); //"The value associated with the key 'a string'" //Parce que keyString === 'a string'

La clé est un objet

var myMap = new Map(); var keyObj = {}, myMap.set(keyObj, "La valeur associée à la clé keyObj");  myMap.get(keyObj); //"La valeur associée à la clé keyObj" myMap.get({}); //undefined, car keyObj !== {}

La clé est une fonction

var myMap = new Map(); var keyFunc = function () {}, //Function myMap.set(keyFunc, "La valeur associée à la clé keyFunc"); myMap.get(keyFunc); //"La valeur associée à la clé keyFunc" myMap.get(function() {}) //undefined, car keyFunc !== function () {}

La clé est NaN

var myMap = new Map(); myMap.set(NaN, "pas un nombre"); myMap.get(NaN); // "pas un nombre" var otherNaN = Number("foo"); myMap.get(otherNaN); // "not a number"

Bien que NaN ne soit égal à aucune valeur, même pas à lui-même (NaN !== NaN renvoie true), en tant que clé de Map, NaN ne fait aucune différence.

Itération de Map

Pour parcourir un Map, les deux qui suivent sont les plus puissantes.

for...of

var myMap = new Map(); myMap.set(0, "zero"); myMap.set(1, "one"); //Il affichera deux logs. L'un est "0 = zero" et l'autre est "1 = one". for (var [key, value] of myMap) {   console.log(key + " = " + value); } for (var [key, value] of myMap.entries()) { console.log(key + " = " + value); } /*La méthode entries renvoie un nouvel objet Iterator qui contient le tableau [key, value] de chaque élément de l'objet Map dans l'ordre d'insertion.*/ //Il affichera deux logs. L'un est "0" et l'autre est "1". for (var key of myMap.keys()) {   console.log(key); } /*La méthode keys renvoie un nouvel objet Iterator qui contient les clés de chaque élément de l'objet Map dans l'ordre d'insertion.*/ //Cela affichera deux logs. L'un est "zero" et l'autre est "one". for (var value of myMap.values()) {   console.log(value); } /*La méthode values renvoie un nouvel objet Iterator qui contient les valeurs de chaque élément de l'objet Map dans l'ordre d'insertion.*/

forEach()

var myMap = new Map(); myMap.set(0, "zero"); myMap.set(1, "one"); //Il affichera deux logs. L'un est "0 = zero" et l'autre est "1 = one". myMap.forEach(function(value, key) { console.log(key + " = " + value); }, myMap)

Opérations sur les objets Map

Conversion entre Map et Array

var kvArray = [["key1", "value1"], ["key2", "value2"]]; //Le constructeur Map peut convertir un tableau bidimensionnel de paires clé-valeur en un objet Map. var myMap = new Map(kvArray); //L'utilisation de la fonction Array.from peut convertir un objet Map en un tableau de paires clé-valeur à deux dimensions. var outArray = Array.from(myMap);

Clonage d'une Map

var myMap1 = new Map([["key1", "value1"], ["key2", "value2"]]); var myMap2 = new Map(myMap1); console.log(original === clone); //Affiche false. Le constructeur de l'objet Map génère une instance, et l'itération produit un nouvel objet.

Fusion de Maps

var first = new Map([[1, 'one'], [2, 'two'], [3, 'three'],]); var second = new Map([[1, 'uno'], [2, 'dos']]); //Lors de la fusion de deux objets Map, s'il y a des clés en double, la dernière écrase la première. Les valeurs correspondantes sont uno, dos, three. var merged = new Map([...first, ...second]);

Objet Set

Les objets Set vous permettent de stocker des valeurs uniques de tout type, qu'il s'agisse de valeurs primitives ou de références d'objets.

Valeurs spéciales dans Set

Les valeurs stockées dans un objet Set sont toujours uniques, il est donc nécessaire de déterminer si deux valeurs sont strictement égales. Quelques valeurs spéciales nécessitent un traitement particulier :

  • +0 et -0 sont strictement égaux lors de la détermination de l'unicité pour le stockage, donc ils ne sont pas dupliqués ;
  • undefined et undefined sont strictement égaux, donc ils ne sont pas dupliqués ;
  • NaN et NaN ne sont pas strictement égaux, mais dans un Set, un seul peut être stocké, donc ils ne sont pas dupliqués.

Code

let mySet = new Set(); mySet.add(1); // Set(1) {1} mySet.add(5); // Set(2) {1, 5} mySet.add(5); //Set(2) {1, 5} Ici, cela reflète l'unicité des valeurs. mySet.add("some text"); //Set(3) {1, 5, "some text"} Ici, cela reflète la diversité des types. var o = {a: 1, b: 2}; mySet.add(o); mySet.add({a: 1, b: 2}); // Set(5) {1, 5, "some text", {…}, {…}} //Ici, cela reflète que les références d'objets sont différentes et non strictement égales ; même si les valeurs sont identiques, Set peut quand même les stocker.

Conversion de type

Tableau

//Array vers Set var mySet = new Set(["value1", "value2", "value3"]); //Utilisez l'opérateur ... pour convertir un Set en Array. var myArray = [...mySet]; String //String vers Set var mySet = new Set('hello');  // Set(4) {"h", "e", "l", "o"} //Remarque : la méthode toString de Set ne peut pas convertir un Set en String.

Utilisation de l'objet Set

Dédoublonnage d'Array

var mySet = new Set([1, 2, 3, 4, 4]); [...mySet]; // [1, 2, 3, 4]

Union

var a = new Set([1, 2, 3]); var b = new Set([4, 3, 2]); var union = new Set([...a, ...b]); // {1, 2, 3, 4}

Intersection

var a = new Set([1, 2, 3]); var b = new Set([4, 3, 2]); var intersect = new Set([...a].filter(x => b.has(x))); // {2, 3}

Différence

var a = new Set([1, 2, 3]); var b = new Set([4, 3, 2]); var difference = new Set([...a].filter(x => !b.has(x))); // {1}