JavaScript Map: almacenamiento y búsqueda clave-valor

Un objeto Map de JavaScript almacena pares clave-valor y permite que cualquier valor (objetos, funciones o primitivos) sea una clave. Úsalo cuando necesites iteración en orden de inserción, claves no string o altas frecuentes y eliminaciones. A diferencia de los objetos planos, las claves de Map no se ven afectadas por propiedades heredadas del prototipo, lo que evita sorpresas con claves dinámicas de tipo string.

Ejemplo de JavaScript Map para almacenamiento clave-valor

Salida:

La salida aparecerá aquí...

Salida:

95
false
2

Cómo funciona este ejemplo

  1. new Map() crea un mapa vacío. Llamar a Map() sin new lanza un TypeError.
  2. set agrega un par clave-valor y devuelve la instancia de Map, lo que permite encadenar llamadas como map.set("a", 1).set("b", 2). Llamar a set con una clave existente sobrescribe el valor sin cambiar la posición de iteración de esa clave.
  3. get devuelve el valor almacenado, o undefined si falta la clave. Usa has para distinguir una clave ausente de una clave establecida explícitamente en undefined.
  4. size refleja el número actual de entradas; a diferencia de los objetos, que requieren Object.keys(obj).length.

Errores comunes con JavaScript Map

Usar sintaxis de corchetes en lugar de set/get:

Incorrecto:

const map = new Map();
map["clave"] = "valor";
console.log(map.get("clave")); // undefined

Correcto:

const map = new Map();
map.set("clave", "valor");
console.log(map.get("clave")); // "valor"

La sintaxis de corchetes establece una propiedad de objeto en la instancia de Map, no una entrada de Map. get, has y size la ignoran.

Esperar igualdad estructural para claves de objeto:

Incorrecto:

const map = new Map();
map.set({id: 1}, "ana");
console.log(map.get({id: 1})); // undefined

Correcto:

const clave = {id: 1};
map.set(clave, "ana");
console.log(map.get(clave)); // "ana"

Map usa SameValueZero para la igualdad de claves. Para objetos, eso significa identidad por referencia: dos literales de objeto con la misma forma son claves distintas.

JavaScript Map vs Object

MapObject
Tipos de claveCualquier valor (objetos, funciones, primitivos)Solo strings y Symbols
Orden de iteraciónOrden de inserción (garantizado)Casi siempre orden de inserción, pero las claves tipo entero van primero
Tamañomap.sizeObject.keys(obj).length
Colisiones de prototipoNingunaLas claves pueden sombrear toString, constructor, etc.
Serialización JSONManual con Object.fromEntriesJSON.stringify incorporado

Usa Map cuando las claves no sean strings, cuando agregues y elimines entradas con frecuencia o cuando almacenes claves no confiables. Usa un objeto plano para registros de forma fija o datos que necesiten serialización JSON. Si necesitas un objeto pero quieres evitar colisiones con claves del prototipo, usa Object.create(null) como objeto de respaldo.

Preguntas frecuentes

¿JavaScript Map conserva el orden de inserción?

Sí. Map itera las entradas en el orden en que se insertaron por primera vez. set() sobre una clave existente actualiza el valor pero mantiene la posición original. Eliminar una clave y volver a agregarla la mueve al final.

¿Puede JavaScript Map usar objetos como claves?

Sí, pero Map compara claves de objeto por referencia, no por estructura. Dos objetos distintos con las mismas propiedades se tratan como claves separadas. Guarda la referencia en una variable y usa esa misma referencia tanto en set como en get.

¿Cómo convierto un JavaScript Map en un objeto o JSON?

Llama a Object.fromEntries(map) para crear un objeto plano; esto funciona cuando todas las claves son strings o símbolos. Para claves no string, serializa el array de entradas: JSON.stringify([...map]).

¿Cuál es la diferencia entre JavaScript Map y la función map() de JavaScript?

Map es una colección clave-valor para almacenar y recuperar datos. La función map() de JavaScript (Array.prototype.map) es un método de arrays que devuelve un array nuevo al aplicar un callback a cada elemento. Comparten el nombre, pero cumplen propósitos distintos.