Lección 49: Map y Set
🧠 Concepto
Section titled “🧠 Concepto”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 valoresmapa.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 existenciaconsole.log(mapa.has('nombre')); // trueconsole.log(mapa.has('edad')); // false
// Tamañoconsole.log(mapa.size); // 4
// Eliminarmapa.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 valoresset.add(1);set.add(2);set.add(3);set.add(1); // ignorado (ya existe)
console.log(set.size); // 3console.log(set.has(2)); // trueconsole.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]💻 Ejemplo
Section titled “💻 Ejemplo”// Iterar Mapconst usuarios = new Map([ [1, { nombre: 'Ana', rol: 'admin' }], [2, { nombre: 'Luis', rol: 'editor' }], [3, { nombre: 'Carlos', rol: 'usuario' }]]);
// forEachusuarios.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 Valuesconsole.log([...usuarios.keys()]); // [1, 2, 3]console.log([...usuarios.values()]); // [{...}, {...}, {...}]
// Set con objetosconst 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 claveconsole.log(visitas.size); // 3 (pagina1 y pagina3 son distintos objetos)⚠️ Nota
Section titled “⚠️ Nota”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 requiereObject.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 quearray.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 arrayconst conDuplicados = [1, 2, 2, 3, 3, 3];const sinDuplicados = [...new Set(conDuplicados)];console.log(sinDuplicados); // [1, 2, 3]📝 Ejercicio
Section titled “📝 Ejercicio”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')); // 3console.log(frecuencias.get('mundo')); // 2console.log(frecuencias.get('javascript')); // 1