como-usar-map-en-javascript

El tipo Map en JavaScript

Un Map es una colección que nos permite almacenar pares de clave-valor, introducida en el estándar ECMAScript 6.

A diferencia de los objetos (Object) (que también almacenan pares clave-valor) los Map ofrecen varias ventajas en términos de rendimiento y funcionalidad. Estas son.

  • Claves de cualquier tipo, las claves pueden ser de cualquier tipo (no solo strings o símbolos)
  • Orden, mantienen el orden de inserción.
  • Propiedad size, que indica cuántos pares clave-valor contiene.
  • Fácilmente iterable, podemos recorrer sus elementos fácilmente.
  • Mejor rendimiento, para operaciones de inserción y eliminación.

Creación de un Map

Para crear un Map, simplemente utilizamos el constructor de la clase:

const mapa = new Map();

Aquí hemos creado un Map vacío, listo para almacenar pares clave-valor.

También podemos inicializar un Map con una colección iterable de pares clave-valor:

const mapa = new Map([
  ['clave1', 'valor1'],
  ['clave2', 'valor2'],
  [3, 'valor3']
]);

Uso básico de Map

Añadir pares clave-valor

Para añadir elementos a un Map, utilizamos el método .set():

const miMapa = new Map();

// Agregamos claves y valores
miMapa.set("clave1", "valor1");
miMapa.set(2, "valor2");
miMapa.set({ objeto: "clave" }, "valor3");

console.log(miMapa);
// Map(3) { 'clave1' => 'valor1', 2 => 'valor2', { objeto: 'clave' } => 'valor3' }

Cada llamada a .set() sobrescribe el valor si la clave ya existe.

Acceder a los valores

Para obtener el valor asociado a una clave, usamos el método .get():

console.log(miMapa.get("clave1")); // 'valor1'
console.log(miMapa.get(2)); // 'valor2'

// Usar un objeto como clave
const objetoClave = { objeto: "clave" };
miMapa.set(objetoClave, "nuevo valor");
console.log(miMapa.get(objetoClave)); // 'nuevo valor'

Verificar si una clave existe

Podemos usar el método .has() para comprobar si una clave está presente en el Map:

console.log(miMapa.has("clave1")); // true
console.log(miMapa.has("claveInexistente")); // false

Eliminar elementos

Para eliminar un elemento específico, utilizamos .delete():

miMapa.delete(2);
console.log(miMapa); // Map(2) { 'clave1' => 'valor1', { objeto: 'clave' } => 'nuevo valor' }

Para eliminar todos los elementos, usamos .clear():

miMapa.clear();
console.log(miMapa); // Map(0) {}

Recorrer un Map

Los Map ofrecen varias formas de iteración:

Usando forEach()

El método .forEach() permite recorrer todos los pares clave-valor en un Map:

miMapa.forEach((valor, clave) => {
  console.log(`Clave: ${clave}, Valor: ${valor}`);
});
// Salida:
// Clave: a, Valor: 1
// Clave: b, Valor: 2
// Clave: c, Valor: 3

Usando un bucle for...of

También podemos usar un bucle for...of con los métodos .entries(), .keys() o .values():

// Recorrer entradas
for (const [clave, valor] of miMapa.entries()) {
  console.log(`Clave: ${clave}, Valor: ${valor}`);
}

// Recorrer claves
for (const clave of miMapa.keys()) {
  console.log(`Clave: ${clave}`);
}

// Recorrer valores
for (const valor of miMapa.values()) {
  console.log(`Valor: ${valor}`);
}

Ejemplos prácticos