No JavaScript, as estruturas Map e Object são ambas usadas para armazenar pares de chave-valor, mas diferem significativamente em design e aplicação. Este guia explora suas distinções principais, cenários de uso ideais e métodos para conversão mútua.
Diferenças Fundamentais
A tabela a seguir resume os contrastes principais:
| Característica | Map | Object |
|---|---|---|
| Tipos de chave | Aceita qualquer tipo, como objetos, funções ou valores primitivos | Limitado a strings ou símbolos |
| Ordenação | Mantém estritamente a ordem de inserção | A ordenação depende da implementação do motor JS, com inconsistências em versões antigas |
| Propriedades herdadas | Não possui, garantindo um armazenamento puro de pares chave-valor | Pode herdar propriedades da cadeia de protótipos, como constructor |
| Desempenho | Melhor para operações frequentes de adição e remoção | Otimizado para acesso rápido a propriedades conhecidas |
| Iteração | Suporta diretamente loops for...of |
Requer métodos como Object.keys() para obter um array de chaves antes de iterar |
| Tamanho | Acessível via propriedade size |
Deve ser calculado manualmente, por exemplo, Object.keys(obj).length |
Cenários de Uso Recomendados
Considere usar Map quando:
- As chaves não são strings, como objetos ou funções.
- Há necessidade de manipulação dinâmica de dados com frequentes adições e exclusões.
- A ordem de inserção é crítica, como em filas ou séries temporais.
- Ambientes de segurança exigem evitar poluição de protótipos.
- O acesso direto ao número de pares é necessário.
Opte por Object em casos como:
- Chaves simples e estáticas, como strings ou símbolos.
- Necessidade de integração com JSON via serialização e desserialização.
- Uso de características de objetos, como métodos, herança por protótipos ou desestruturação.
- Cenários com operações previsíveis onde o desempenho do motor JS é otimizado para objetos.
Métodos de Conversão
Convertendo Object para Map
Utilize Object.entries() para transformar um objeto em um Map:
const informacoes = { preco: 99.9, quantidade: 5 };
const mapaInfo = new Map(Object.entries(informacoes));
// Resultado: Map { 'preco' => 99.9, 'quantidade' => 5 }
Convertendo Map para Object
Empregue Object.fromEntries() para converter um Map em objeto:
const configMap = new Map([["chave1", "valorA"], ["chave2", "valorB"]]);
const configObj = Object.fromEntries(configMap);
// Resultado: { chave1: 'valorA', chave2: 'valorB' }
Observação importante: Se um Map possuir chaves não-string, como objetos, elas serão convertidas implicitamente para strings durante a conversão, resultando em chaves como '[object Object]'.
const idUsuario = { id: 101 };
const registros = new Map([[idUsuario, "ativo"]]);
const registroObj = Object.fromEntries(registros);
// Resultado: { '[object Object]': 'ativo' } — a chave original é perdida
Ao trabalhar com conversões, avalie sempre os tipos das chaves para evitar comportamentos inesperados. A escolha entre Map e Object deve basear-se nas necessidades específicas de ordenação, desempenho e tipo de chave.