Map en JavaScript
En JavaScript el objeto Map
es una estructura de datos introducida en ES6 que permite almacenar pares clave-valor de manera más eficiente y flexible que los objetos (Object
). A diferencia de estos últimos, un Map
puede utilizar claves de cualquier tipo, como objetos, números o funciones, y garantiza el orden de inserción de los elementos.
¿Qué es un Map
y por qué usarlo?
Un Map
es una colección ordenada de pares clave-valor que se utiliza para representar relaciones entre datos. Aunque los objetos también se utilizan para este propósito, los Map
ofrecen ventajas como:
- Permitir claves de cualquier tipo, no solo cadenas.
- Mantener el orden de inserción, lo cual es crucial en muchas aplicaciones.
- Proporcionar métodos nativos específicos para la gestión de claves y valores.
¿Cuándo usar Map
en lugar de Object
?
- Si necesitas claves que no sean cadenas (por ejemplo, números u objetos),
Map
es ideal. - Si planeas iterar frecuentemente sobre las claves o valores,
Map
es más eficiente y directo.
Ejemplo básico:
const mapa = new Map([
['nombre', 'Carlos'],
['edad', 30]
]);
console.log(mapa.get('nombre'));
"Carlos"
Propiedades y Métodos Principales de Map
Map
cuenta con varias propiedades y métodos diseñados para facilitar el manejo de los pares clave-valor. A continuación, se explican en detalle.
Propiedad size
La propiedad size
devuelve el número total de pares clave-valor en el Map
. Esto resulta útil para verificar rápidamente cuántos elementos contiene la colección.
const mapa = new Map([
['clave1', 'valor1'],
['clave2', 'valor2']
]);
console.log(mapa.size);
2
A diferencia de los objetos, no es necesario usar métodos adicionales como Object.keys()
para contar las propiedades. Con Map
, la propiedad size
está directamente disponible.
Método set(key, value)
El método set
agrega un nuevo par clave-valor al Map
. Si la clave ya existe, el valor se actualiza.
const mapa = new Map();
mapa.set('clave', 'valor inicial');
mapa.set('clave', 'valor actualizado'); // Sobrescribe el valor anterior
console.log(mapa.get('clave'));
"valor actualizado"
Detalle adicional: set
devuelve el propio Map
, lo que permite el encadenamiento de métodos:
mapa.set('a', 1).set('b', 2).set('c', 3);
Método get(key)
El método get
devuelve el valor asociado a una clave específica. Si la clave no existe, retorna undefined
.
console.log(mapa.get('claveInexistente'));
ReferenceError: mapa is not defined
A diferencia de los objetos, no se requiere manipular estructuras complejas para buscar valores; get
simplifica la consulta directa.
Método has(key)
El método has
verifica si una clave específica existe en el Map
. Devuelve un booleano (true
o false
).
const mapa = new Map();
mapa.set('clave', 'valor inicial');
console.log(mapa.has('clave'));
console.log(mapa.has('otraClave'));
true
false
Caso práctico: Útil para comprobar si un dato ya está registrado antes de intentar añadirlo:
if (!mapa.has('clave')) {
mapa.set('clave', 'nuevo valor');
}
Método delete(key)
El método delete
elimina un par clave-valor de la colección. Devuelve true
si la clave existía y fue eliminada, o false
si no se encontró.
const mapa = new Map();
mapa.set('clave', 'valor inicial');
mapa.delete('clave');
console.log(mapa.has('clave'));
false
Ventaja sobre los objetos: En un objeto, eliminar propiedades implica usar delete propiedad
, lo que puede ser más propenso a errores en comparación con la claridad de delete()
en Map
.
Método clear()
El método clear
elimina todos los pares clave-valor de un Map
. Esto reinicia la colección, dejándola vacía.
const mapa = new Map();
mapa.set('clave', 'valor inicial');
mapa.clear();
console.log(mapa.size);
0
¿Cuándo usarlo? Ideal para reiniciar datos temporales o limpiar cachés en aplicaciones.
Iteración sobre Map
Una de las grandes ventajas de Map
es su compatibilidad nativa con métodos de iteración.
– Método keys()
: Devuelve un iterador con todas las claves del Map
.
for (const clave of mapa.keys()) {
console.log(clave);
}
– Método values()
: Devuelve un iterador con todos los valores del Map
.
for (const valor of mapa.values()) {
console.log(valor);
}
– Método entries()
: Devuelve un iterador con los pares clave-valor en forma de arrays.
for (const [clave, valor] of mapa.entries()) {
console.log(`${clave}: ${valor}`);
}
– Uso con forEach
: Map
también soporta el método forEach
para iterar sobre los pares clave-valor.
mapa.forEach((valor, clave) => {
console.log(`${clave}: ${valor}`);
});
Diferencias Clave entre Map
y Object
Característica | Map | Object |
---|---|---|
Claves | Cualquier tipo | Solo cadenas o símbolos |
Iterabilidad | Nativo (for...of ) | Requiere Object.keys o similar |
Rendimiento | Más eficiente en colecciones grandes | Menos eficiente |
Orden de Inserción | Garantizado | No garantizado |
Ejemplo Básico: Contador de Palabras
Supongamos que queremos contar la frecuencia de cada palabra en una frase utilizando Map
.
const frase = 'hola mundo hola javascript mundo javascript javascript';
const palabras = frase.split(' ');
const contador = new Map();
palabras.forEach((palabra) => {
if (contador.has(palabra)) {
contador.set(palabra, contador.get(palabra) + 1);
} else {
contador.set(palabra, 1);
}
});
console.log(contador);
Map(3) {hola: 2, mundo: 2, javascript: 3}
Casos de Uso de Map
- Almacenar configuraciones:
Map
es ideal para guardar configuraciones con claves dinámicas. - Seguimiento de referencias a objetos: Dado que las claves pueden ser objetos, es útil para almacenar datos asociados a instancias específicas.
- Reemplazo de
Object
cuando se necesita iterabilidad:Map
facilita la iteración directa sobre claves y valores sin métodos adicionales.
Conclusión
El objeto Map
ofrece flexibilidad y eficiencia en comparación con los objetos tradicionales. Gracias a su compatibilidad con claves de cualquier tipo, métodos nativos de iteración y mejor rendimiento, se ha convertido en una herramienta esencial en la caja de herramientas de cualquier desarrollador.
En el próximo artículo exploraremos Set en JavaScript, una colección diseñada para manejar valores únicos.