Skip to content

Lección 49: Map y Set

Map y Set son estructuras de datos introducidas en ES6 que mejoran los objetos y arrays tradicionales.

Un Map es una colección de pares clave-valor donde las claves pueden ser cualquier tipo (objetos, funciones, números, etc.).

const mapa = new Map();
// Añadir y obtener valores
mapa.set('nombre', 'Ana');
mapa.set(1, 'número uno');
mapa.set(true, 'booleano');
mapa.set({ id: 1 }, 'objeto como clave');
console.log(mapa.get('nombre')); // "Ana"
console.log(mapa.get(1)); // "número uno"
console.log(mapa.get(true)); // "booleano"
// Verificar existencia
console.log(mapa.has('nombre')); // true
console.log(mapa.has('edad')); // false
// Tamaño
console.log(mapa.size); // 4
// Eliminar
mapa.delete('nombre');
console.log(mapa.size); // 3
// Vaciar
// mapa.clear();

Un Set es una colección de valores únicos (sin duplicados).

const set = new Set();
// Añadir valores
set.add(1);
set.add(2);
set.add(3);
set.add(1); // ignorado (ya existe)
console.log(set.size); // 3
console.log(set.has(2)); // true
console.log(set.has(4)); // false
set.delete(1);
console.log(set.size); // 2
// Inicializar desde array (eliminar duplicados)
const numeros = [1, 2, 2, 3, 3, 3, 4];
const unicos = new Set(numeros);
console.log([...unicos]); // [1, 2, 3, 4]
// Iterar Map
const usuarios = new Map([
[1, { nombre: 'Ana', rol: 'admin' }],
[2, { nombre: 'Luis', rol: 'editor' }],
[3, { nombre: 'Carlos', rol: 'usuario' }]
]);
// forEach
usuarios.forEach((valor, clave) => {
console.log(`${clave}: ${valor.nombre} (${valor.rol})`);
});
// for...of (entries es el default)
for (const [id, usuario] of usuarios) {
console.log(id, usuario.nombre);
}
// Keys y Values
console.log([...usuarios.keys()]); // [1, 2, 3]
console.log([...usuarios.values()]); // [{...}, {...}, {...}]
// Set con objetos
const visitas = new Set();
const pagina1 = { url: '/home' };
const pagina2 = { url: '/about' };
const pagina3 = { url: '/home' }; // objeto distinto (misma URL)
visitas.add(pagina1);
visitas.add(pagina2);
visitas.add(pagina3); // se añade porque es otro objeto
// Para evitar duplicados por valor, usar Map con string como clave
console.log(visitas.size); // 3 (pagina1 y pagina3 son distintos objetos)

Map vs Objeto:

  • Las claves de Object son strings o Symbols. Map acepta cualquier tipo.
  • Map preserva el orden de inserción.
  • Map tiene .size (Object requiere Object.keys().length).
  • Map es mejor para añadir/eliminar pares frecuentemente.
  • Object es mejor para estructura conocida y acceso directo con ..

Set vs Array:

  • Set no tiene índices ni orden (aunque preserva inserción).
  • Set no tiene duplicados.
  • Set tiene .has() más rápido que array.includes().
  • Set no tiene métodos como .map() o .filter() directamente (pero puedes convertirlo a array).

Usa Map cuando:

  • Necesites claves que no sean strings
  • Necesites preservar orden de inserción
  • Vayas a añadir/eliminar pares frecuentemente

Usa Set cuando:

  • Necesites valores únicos
  • Quieras eliminar duplicados de un array
  • Necesites verificar pertenencia rápidamente
// Eliminar duplicados de array
const conDuplicados = [1, 2, 2, 3, 3, 3];
const sinDuplicados = [...new Set(conDuplicados)];
console.log(sinDuplicados); // [1, 2, 3]

Escribe una función contarPalabras que reciba un string y devuelva un Map con cada palabra y su frecuencia.

function contarPalabras(texto) {
// Tu código aquí
}
const texto = "hola mundo hola javascript mundo hola";
const frecuencias = contarPalabras(texto);
console.log(frecuencias.get('hola')); // 3
console.log(frecuencias.get('mundo')); // 2
console.log(frecuencias.get('javascript')); // 1