Hashmaps em JavaScript: Objetos vs. o Objeto Map
JavaScript não possui um equivalente direto a “HashMap” como algumas outras linguagens. No entanto, podemos alcançar funcionalidades similares usando duas abordagens principais: objetos JavaScript simples e o objeto Map
embutido. Este artigo explora ambas, comparando seus pontos fortes e fracos para ajudá-lo a escolher a melhor abordagem para suas necessidades.
Sumário
Usando Objetos como Hashmaps
Objetos JavaScript podem funcionar como hashmaps simples. Eles usam chaves string para acessar valores associados. Essa abordagem é direta, mas tem limitações.
Exemplo:
const myHashMap = {}; // Cria um objeto vazio
// Insere pares chave-valor
myHashMap.apple = 1;
myHashMap.banana = 2;
myHashMap.cherry = 3;
// Acessa valores
console.log(myHashMap.banana); // Saída: 2
// Verifica se uma chave existe
console.log('apple' in myHashMap); // Saída: true
// Deleta um par chave-valor
delete myHashMap.banana;
// Itera sobre pares chave-valor (Observação: a ordem não é garantida)
for (const key in myHashMap) {
console.log(key, myHashMap[key]);
}
Vantagens:
- Simples e familiar para desenvolvedores JavaScript.
- Sem dependências externas.
Desvantagens:
- As chaves são limitadas a strings (ou valores que implicitamente convertem para strings).
- Não possui propriedade de tamanho embutida; você precisa controlar o tamanho manualmente.
- Falta métodos embutidos como
get
,set
,has
, etc. - A ordem das chaves não é garantida.
Usando o Objeto Map
O objeto Map
(introduzido no ES6) oferece uma solução mais robusta. Ele suporta qualquer tipo de dado como chave, evita problemas de coerção de tipo e fornece métodos embutidos para manipulação eficiente.
Exemplo:
const myMap = new Map();
// Insere pares chave-valor
myMap.set("apple", 1);
myMap.set(123, "number"); // Número como chave
myMap.set({ a: 1 }, "object"); // Objeto como chave
// Acessa valores
console.log(myMap.get("apple")); // Saída: 1
console.log(myMap.get(123)); // Saída: "number"
// Verifica se uma chave existe
console.log(myMap.has("apple")); // Saída: true
// Deleta um par chave-valor
myMap.delete("apple");
// Obtém o tamanho
console.log(myMap.size); // Saída: 2
// Itera sobre pares chave-valor (a ordem é preservada)
for (const [key, value] of myMap) {
console.log(key, value);
}
Vantagens:
- Suporta qualquer tipo de dado como chave.
- Fornece métodos embutidos (
set
,get
,has
,delete
,size
). - Itera eficientemente com loops
for...of
. - Preserva a ordem de inserção.
Desvantagens:
- Requer compatibilidade com ES6 (embora existam polyfills disponíveis).
Conclusão
Enquanto objetos JavaScript simples podem ser suficientes para comportamentos simples de tipo hashmap, o objeto Map
é geralmente recomendado por suas características superiores e eficiência. A menos que você esteja severamente limitado pela compatibilidade do navegador, Map
é a escolha preferida para a maioria dos projetos JavaScript modernos.