Map
Un Map es una colección de pares clave → valor. Suena parecido a un objeto, pero tiene superpoderes que un objeto normal no tiene.
Crear un Map
Lo creamos con new Map(). Puede partir vacío o de un array de pares [clave, valor]:
const vacio = new Map()
const edades = new Map([
['Dani', 18],
['Eva', 25]
])
console.log(edades) // Map(2) { 'Dani' => 18, 'Eva' => 25 }
Métodos y propiedades
.set()
Añade o actualiza un par clave-valor. Devuelve el propio Map, así que se puede encadenar:
const edades = new Map()
edades.set('Dani', 18).set('Eva', 25)
console.log(edades.get('Dani')) // 18
.get()
Obtiene el valor asociado a una clave. Si la clave no existe, devuelve undefined:
const edades = new Map([['Dani', 18]])
console.log(edades.get('Dani')) // 18
console.log(edades.get('Nadie')) // undefined
.has()
Comprueba si una clave existe en el Map:
const edades = new Map([['Dani', 18]])
console.log(edades.has('Dani')) // true
console.log(edades.has('Eva')) // false
.delete() y .clear()
.delete() elimina una entrada por su clave; .clear() lo vacía entero:
const edades = new Map([
['Dani', 18],
['Eva', 25]
])
edades.delete('Dani')
console.log(edades) // Map(1) { 'Eva' => 25 }
edades.clear()
console.log(edades.size) // 0
.size
Nos dice cuántas entradas tiene:
const edades = new Map([['Dani', 18]])
console.log(edades.size) // 1
La gran ventaja: claves de cualquier tipo
En un objeto normal, las claves siempre acaban siendo string (o symbol). En un Map, la clave puede ser lo que quieras: un número, un objeto, una función...
const usuario = { id: 1 }
const datos = new Map()
datos.set(usuario, 'es admin')
datos.set(42, 'la respuesta')
console.log(datos.get(usuario)) // 'es admin'
console.log(datos.get(42)) // 'la respuesta'
NotaLas claves de tipo objeto se comparan por referencia. Para recuperar un valor tienes que usar exactamente la misma referencia que usaste al guardarlo.
datos.get({ id: 1 }) devuelve undefined.Iterar un Map
Un Map también es iterable y, además, mantiene el orden de inserción:
const edades = new Map([
['Dani', 18],
['Eva', 25]
])
for (const [nombre, edad] of edades) {
console.log(`${nombre} tiene ${edad} años`)
}
// Dani tiene 18 años
// Eva tiene 25 años
Tienes métodos específicos para recorrer claves, valores o ambos:
const edades = new Map([['Dani', 18], ['Eva', 25]])
console.log([...edades.keys()]) // ['Dani', 'Eva']
console.log([...edades.values()]) // [18, 25]
console.log([...edades.entries()]) // [['Dani', 18], ['Eva', 25]]
Map vs Objeto: ¿cuál uso?
Usa un Map cuando:
- Las claves no son strings (números, objetos...).
- Vas a añadir y eliminar entradas con frecuencia.
- Te importa el orden de inserción.
- Necesitas saber el tamaño rápido con
.size.
Usa un objeto cuando:
- Modelas una entidad con propiedades conocidas (
{ name, age }). - Quieres usar la sintaxis cómoda con
.yJSON.