JavaScript Coleções Intermediário
Map e Set
Em JavaScript, Map e Set são coleções introduzidas no ES6 que resolvem limitações de objetos e arrays. Um Map armazena pares chave-valor onde as chaves podem ser de qualquer tipo (incluindo objetos e funções), mantém a ordem de inserção e tem métodos específicos como set, get, has, delete e size. Já um Set é uma coleção de valores únicos, ideal para eliminar duplicatas e verificar pertinência rapidamente.
Diferente de objetos, que convertem chaves para strings (ou símbolos), o Map preserva o tipo original da chave. Isso evita colisões inesperadas e permite usar objetos como chaves. Além disso, Map e Set são iteráveis por padrão, o que facilita o uso de for...of, spread e destructuring.
Para casos em que você precisa associar dados a um objeto sem impedir que ele seja coletado pelo garbage collector, existe o WeakMap. Ele aceita apenas objetos como chaves e não é iterável, mas mantém referências fracas, evitando vazamentos de memória. O WeakSet segue a mesma ideia para valores únicos.
Neste card, você vai praticar a diferença entre Map e objetos, como remover duplicatas com Set, quando usar WeakMap e como percorrer essas coleções de forma idiomática.
Pontos-chave
Mapaceita chaves de qualquer tipo e mantém a ordem de inserção; objetos comuns convertem chaves para string.Setarmazena valores únicos e oferece verificação de pertinência em tempo constante.WeakMapsó aceita objetos como chaves e não é iterável, permitindo coleta de lixo das chaves.MapeSetsão iteráveis: usefor...of, spread ouforEachpara percorrê-los.- Prefira
Mapquando precisar de chaves não-string ou de operações frequentes de adição/remoção.
// Demonstração de Map, Set e WeakMap
// Map: chaves de qualquer tipo
const usuarios = new Map();
usuarios.set('ana', { idade: 28 });
usuarios.set(42, 'resposta'); // chave numérica
console.log(usuarios.get('ana')); // { idade: 28 }
console.log(usuarios.has(42)); // true
console.log(usuarios.size); // 2
// Iteração com for...of
for (const [chave, valor] of usuarios) {
console.log(chave, valor);
}
// Set: valores únicos
const numeros = new Set([1, 2, 2, 3, 3, 3]);
console.log(numeros); // Set(3) { 1, 2, 3 }
numeros.add(4);
console.log(numeros.has(2)); // true
// Removendo duplicatas de um array com Set
const comDuplicatas = ['a', 'b', 'a', 'c', 'b'];
const unicos = [...new Set(comDuplicatas)];
console.log(unicos); // ['a', 'b', 'c']
// WeakMap: chaves apenas objetos, não iterável
const cache = new WeakMap();
const obj = {};
cache.set(obj, 'dado secreto');
console.log(cache.get(obj)); // 'dado secreto'
// cache.set('string', 1); // TypeError: Invalid value used as weak map key