Saltar al contenido principal
12Sets y Maps

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'
Nota

Las claves de tipo objeto se comparan por referencia. Para recuperar un valor tienes que usar exactamente la misma referencia que usaste al guardarlo.

Infografía
Objeto o Map: qué pasa con las claves
6.Otro objeto con el mismo contenido es otra referencia: datos.get({ id: 1 }) devuelve undefined.
Paso 6 de 6

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 . y JSON.