Map en JavaScript

En JavaScript el objeto Map es una estructura de datos introducida en ES6 que permite almacenar pares clave-valor de manera más eficiente y flexible que los objetos (Object). A diferencia de estos últimos, un Map puede utilizar claves de cualquier tipo, como objetos, números o funciones, y garantiza el orden de inserción de los elementos.

¿Qué es un Map y por qué usarlo?

Un Map es una colección ordenada de pares clave-valor que se utiliza para representar relaciones entre datos. Aunque los objetos también se utilizan para este propósito, los Map ofrecen ventajas como:

  1. Permitir claves de cualquier tipo, no solo cadenas.
  2. Mantener el orden de inserción, lo cual es crucial en muchas aplicaciones.
  3. Proporcionar métodos nativos específicos para la gestión de claves y valores.

¿Cuándo usar Map en lugar de Object?

  • Si necesitas claves que no sean cadenas (por ejemplo, números u objetos), Map es ideal.
  • Si planeas iterar frecuentemente sobre las claves o valores, Map es más eficiente y directo.

Ejemplo básico:

const mapa = new Map([
  ['nombre', 'Carlos'],
  ['edad', 30]
]);

console.log(mapa.get('nombre'));
"Carlos"

Propiedades y Métodos Principales de Map

Map cuenta con varias propiedades y métodos diseñados para facilitar el manejo de los pares clave-valor. A continuación, se explican en detalle.

Propiedad size

La propiedad size devuelve el número total de pares clave-valor en el Map. Esto resulta útil para verificar rápidamente cuántos elementos contiene la colección.

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

console.log(mapa.size);
2

A diferencia de los objetos, no es necesario usar métodos adicionales como Object.keys() para contar las propiedades. Con Map, la propiedad size está directamente disponible.


Método set(key, value)

El método set agrega un nuevo par clave-valor al Map. Si la clave ya existe, el valor se actualiza.

const mapa = new Map();
mapa.set('clave', 'valor inicial');
mapa.set('clave', 'valor actualizado'); // Sobrescribe el valor anterior

console.log(mapa.get('clave'));
"valor actualizado"

Detalle adicional: set devuelve el propio Map, lo que permite el encadenamiento de métodos:

mapa.set('a', 1).set('b', 2).set('c', 3);

Método get(key)

El método get devuelve el valor asociado a una clave específica. Si la clave no existe, retorna undefined.

console.log(mapa.get('claveInexistente'));
ReferenceError: mapa is not defined

A diferencia de los objetos, no se requiere manipular estructuras complejas para buscar valores; get simplifica la consulta directa.


Método has(key)

El método has verifica si una clave específica existe en el Map. Devuelve un booleano (true o false).

const mapa = new Map();
mapa.set('clave', 'valor inicial');

console.log(mapa.has('clave'));
console.log(mapa.has('otraClave'));
true
false

Caso práctico: Útil para comprobar si un dato ya está registrado antes de intentar añadirlo:

if (!mapa.has('clave')) {
  mapa.set('clave', 'nuevo valor');
}

Método delete(key)

El método delete elimina un par clave-valor de la colección. Devuelve true si la clave existía y fue eliminada, o false si no se encontró.

const mapa = new Map();
mapa.set('clave', 'valor inicial');

mapa.delete('clave');
console.log(mapa.has('clave'));
false

Ventaja sobre los objetos: En un objeto, eliminar propiedades implica usar delete propiedad, lo que puede ser más propenso a errores en comparación con la claridad de delete() en Map.


Método clear()

El método clear elimina todos los pares clave-valor de un Map. Esto reinicia la colección, dejándola vacía.

const mapa = new Map();
mapa.set('clave', 'valor inicial');

mapa.clear();
console.log(mapa.size);
0

¿Cuándo usarlo? Ideal para reiniciar datos temporales o limpiar cachés en aplicaciones.


Iteración sobre Map

Una de las grandes ventajas de Map es su compatibilidad nativa con métodos de iteración.

Método keys(): Devuelve un iterador con todas las claves del Map.

for (const clave of mapa.keys()) {
  console.log(clave);
}

Método values(): Devuelve un iterador con todos los valores del Map.

for (const valor of mapa.values()) {
  console.log(valor);
}

Método entries(): Devuelve un iterador con los pares clave-valor en forma de arrays.

for (const [clave, valor] of mapa.entries()) {
  console.log(`${clave}: ${valor}`);
}

Uso con forEach: Map también soporta el método forEach para iterar sobre los pares clave-valor.

mapa.forEach((valor, clave) => {
  console.log(`${clave}: ${valor}`);
});

Diferencias Clave entre Map y Object

CaracterísticaMapObject
ClavesCualquier tipoSolo cadenas o símbolos
IterabilidadNativo (for...of)Requiere Object.keys o similar
RendimientoMás eficiente en colecciones grandesMenos eficiente
Orden de InserciónGarantizadoNo garantizado

Ejemplo Básico: Contador de Palabras

Supongamos que queremos contar la frecuencia de cada palabra en una frase utilizando Map.

const frase = 'hola mundo hola javascript mundo javascript javascript';
const palabras = frase.split(' ');

const contador = new Map();

palabras.forEach((palabra) => {
  if (contador.has(palabra)) {
    contador.set(palabra, contador.get(palabra) + 1);
  } else {
    contador.set(palabra, 1);
  }
});

console.log(contador);
Map(3) {hola: 2, mundo: 2, javascript: 3}

Casos de Uso de Map

  1. Almacenar configuraciones: Map es ideal para guardar configuraciones con claves dinámicas.
  2. Seguimiento de referencias a objetos: Dado que las claves pueden ser objetos, es útil para almacenar datos asociados a instancias específicas.
  3. Reemplazo de Object cuando se necesita iterabilidad: Map facilita la iteración directa sobre claves y valores sin métodos adicionales.

Conclusión

El objeto Map ofrece flexibilidad y eficiencia en comparación con los objetos tradicionales. Gracias a su compatibilidad con claves de cualquier tipo, métodos nativos de iteración y mejor rendimiento, se ha convertido en una herramienta esencial en la caja de herramientas de cualquier desarrollador.

En el próximo artículo exploraremos Set en JavaScript, una colección diseñada para manejar valores únicos.

+1
0
+1
0