Objeto Map
El objeto Map almacena pares clave-valor. Cualquier valor (objeto o valor primitivo) puede usarse como clave o como valor.
Diferencia entre Maps y Objects
- Las claves de un Object solo pueden ser cadenas (strings) o Symbols, pero las claves de un Map pueden ser cualquier valor.
- Las claves en un Map están ordenadas (principio FIFO), mientras que las claves añadidas a un objeto no lo están.
- El número de pares clave-valor de un Map se puede obtener de la propiedad size, mientras que el número de pares clave-valor de un Object solo se puede calcular manualmente.
- Object tiene su propio prototipo; los nombres de las claves en la cadena de prototipos pueden entrar en conflicto con los nombres que estableces tú mismo en el objeto.

key en Map
La key es una cadena
var myMap = new Map();
var keyString = "a string";
myMap.set(keyString, "El valor asociado a la clave 'a string'");
myMap.get(keyString);
myMap.get("a string");
La key es un objeto
var myMap = new Map();
var keyObj = {},
myMap.set(keyObj, "El valor asociado a la clave keyObj");
myMap.get(keyObj);
myMap.get({});
La key es una función
var myMap = new Map();
var keyFunc = function () {},
myMap.set(keyFunc, "El valor asociado a la clave keyFunc");
myMap.get(keyFunc);
myMap.get(function() {})
La key es NaN
var myMap = new Map();
myMap.set(NaN, "not a number");
myMap.get(NaN);
var otherNaN = Number("foo");
myMap.get(otherNaN);
Aunque NaN no es igual a ningún valor, ni siquiera a sí mismo (NaN !== NaN devuelve true), como clave de Map no hay diferencia.
Iteración de Map
Para recorrer un Map, las siguientes dos son las más avanzadas.
for...of
var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {
console.log(key + " = " + value);
}
for (var [key, value] of myMap.entries()) {
console.log(key + " = " + value);
}
for (var key of myMap.keys()) {
console.log(key);
}
for (var value of myMap.values()) {
console.log(value);
}
forEach()
var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
myMap.forEach(function(value, key) {
console.log(key + " = " + value);
}, myMap)
Operaciones del objeto Map
Conversión entre Map y Array
var kvArray = [["key1", "value1"], ["key2", "value2"]];
var myMap = new Map(kvArray);
var outArray = Array.from(myMap);
Clonación de Map
var myMap1 = new Map([["key1", "value1"], ["key2", "value2"]]);
var myMap2 = new Map(myMap1);
console.log(original === clone);
Combinación de Map
var first = new Map([[1, 'one'], [2, 'two'], [3, 'three'],]);
var second = new Map([[1, 'uno'], [2, 'dos']]);
var merged = new Map([...first, ...second]);
Objeto Set
El objeto Set te permite almacenar valores únicos de cualquier tipo, ya sean valores primitivos u referencias a objetos.
Valores especiales en Set
Los valores almacenados en un objeto Set son siempre únicos, por lo que es necesario determinar si dos valores son estrictamente iguales. Hay algunos valores especiales que requieren un tratamiento especial:
- +0 y -0 son estrictamente iguales al juzgar la unicidad en el almacenamiento, por lo que no se repiten;
- undefined y undefined son estrictamente iguales, por lo que no se repiten;
- NaN y NaN no son estrictamente iguales, pero en un Set solo se puede almacenar uno, no se repite.
Código
let mySet = new Set();
mySet.add(1);
mySet.add(5);
mySet.add(5);
mySet.add("some text");
var o = {a: 1, b: 2};
mySet.add(o);
mySet.add({a: 1, b: 2});
Conversión de tipos
Array
var mySet = new Set(["value1", "value2", "value3"]);
var myArray = [...mySet];
String
var mySet = new Set('hello');
Utilidad del objeto Set
Eliminar duplicados de un array
var mySet = new Set([1, 2, 3, 4, 4]);
[...mySet];
Unión
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var union = new Set([...a, ...b]);
Intersección
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var intersect = new Set([...a].filter(x => b.has(x)));
Diferencia
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var difference = new Set([...a].filter(x => !b.has(x)));