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
new Map()crea un mapa vacío. Llamar aMap()sinnewlanza unTypeError.setagrega un par clave-valor y devuelve la instancia deMap, lo que permite encadenar llamadas comomap.set("a", 1).set("b", 2). Llamar asetcon una clave existente sobrescribe el valor sin cambiar la posición de iteración de esa clave.getdevuelve el valor almacenado, oundefinedsi falta la clave. Usahaspara distinguir una clave ausente de una clave establecida explícitamente enundefined.sizerefleja el número actual de entradas; a diferencia de los objetos, que requierenObject.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
Map | Object | |
|---|---|---|
| Tipos de clave | Cualquier valor (objetos, funciones, primitivos) | Solo strings y Symbols |
| Orden de iteración | Orden de inserción (garantizado) | Casi siempre orden de inserción, pero las claves tipo entero van primero |
| Tamaño | map.size | Object.keys(obj).length |
| Colisiones de prototipo | Ninguna | Las claves pueden sombrear toString, constructor, etc. |
| Serialización JSON | Manual con Object.fromEntries | JSON.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.