Hashmaps en JavaScript: Objetos vs. el objeto Map
JavaScript no tiene un equivalente directo a «HashMap» como otros lenguajes. Sin embargo, podemos lograr una funcionalidad similar usando dos enfoques principales: objetos JavaScript simples y el objeto Map
integrado. Este artículo explora ambos, comparando sus fortalezas y debilidades para ayudarte a elegir el mejor enfoque para tus necesidades.
Tabla de contenido
Usando Objetos como Hashmaps
Los objetos JavaScript pueden funcionar como hashmaps simples. Usan claves de tipo cadena para acceder a los valores asociados. Este enfoque es sencillo pero tiene limitaciones.
Ejemplo:
const myHashMap = {}; // Crea un objeto vacío
// Insertar pares clave-valor
myHashMap.apple = 1;
myHashMap.banana = 2;
myHashMap.cherry = 3;
// Acceder a los valores
console.log(myHashMap.banana); // Salida: 2
// Comprobar si existe una clave
console.log('apple' in myHashMap); // Salida: true
// Eliminar un par clave-valor
delete myHashMap.banana;
// Iterar sobre los pares clave-valor (Nota: el orden no está garantizado)
for (const key in myHashMap) {
console.log(key, myHashMap[key]);
}
Ventajas:
- Simple y familiar para los desarrolladores JavaScript.
- Sin dependencias externas.
Desventajas:
- Las claves están limitadas a cadenas (o valores que se convierten implícitamente a cadenas).
- No tiene una propiedad de tamaño integrada; debes rastrear el tamaño manualmente.
- Carece de métodos integrados como
get
,set
,has
, etc. - El orden de las claves no está garantizado.
Usando el objeto Map
El objeto Map
(introducido en ES6) ofrece una solución más robusta. Soporta cualquier tipo de dato como clave, evita problemas de coerción de tipo y proporciona métodos integrados para una manipulación eficiente.
Ejemplo:
const myMap = new Map();
// Insertar pares clave-valor
myMap.set("apple", 1);
myMap.set(123, "number"); // Número como clave
myMap.set({ a: 1 }, "object"); // Objeto como clave
// Acceder a los valores
console.log(myMap.get("apple")); // Salida: 1
console.log(myMap.get(123)); // Salida: "number"
// Comprobar si existe una clave
console.log(myMap.has("apple")); // Salida: true
// Eliminar un par clave-valor
myMap.delete("apple");
// Obtener el tamaño
console.log(myMap.size); // Salida: 2
// Iterar sobre los pares clave-valor (el orden se mantiene)
for (const [key, value] of myMap) {
console.log(key, value);
}
Ventajas:
- Soporta cualquier tipo de dato como clave.
- Proporciona métodos integrados (
set
,get
,has
,delete
,size
). - Iteración eficiente con bucles
for...of
. - Conserva el orden de inserción.
Desventajas:
- Requiere compatibilidad con ES6 (aunque hay polillenos disponibles).
Conclusión
Mientras que los objetos JavaScript simples pueden ser suficientes para un comportamiento simple similar a un hashmap, el objeto Map
generalmente se recomienda por sus características superiores y eficiencia. A menos que tengas restricciones severas de compatibilidad con el navegador, Map
es la opción preferida para la mayoría de los proyectos JavaScript modernos.