Da trilha de JavaScript Este conceito ainda não saiu como card do dia. ir para o card de hoje

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

  • Map aceita chaves de qualquer tipo e mantém a ordem de inserção; objetos comuns convertem chaves para string.
  • Set armazena valores únicos e oferece verificação de pertinência em tempo constante.
  • WeakMap só aceita objetos como chaves e não é iterável, permitindo coleta de lixo das chaves.
  • Map e Set são iteráveis: use for...of, spread ou forEach para percorrê-los.
  • Prefira Map quando precisar de chaves não-string ou de operações frequentes de adição/remoção.
map_set.js
// 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

Exercícios

  1. 1
    Fácil

    Contando ocorrências com Map

    Escreva uma função contarOcorrencias(array) que recebe um array de strings e retorna um Map onde cada chave é um elemento e o valor é a quantidade de vezes que ele aparece.

    Resolver
  2. 2
    Médio

    Removendo duplicatas e mantendo a ordem

    Crie uma função unicosOrdenados(array) que remove elementos duplicados de um array e retorna um novo array com os elementos únicos na ordem em que apareceram pela primeira vez. Use Set para garantir unicidade.

    Resolver
  3. 3
    Desafio

    Cache com WeakMap e contagem de acessos

    Implemente uma função criarCache() que retorna um objeto com dois métodos: obter(chave, calcular) e estatisticas(). O método obter recebe um objeto chave e uma função calcular. Se o resultado para aquela chave ainda não estiver no cache, ele chama calcular(chave), armazena o resultado em um WeakMap e retorna. Se já estiver, retorna o valor armazenado. O método estatisticas retorna um Map com a contagem de quantas vezes cada chave foi acessada (incluindo acertos e erros de cache).

    Resolver

Continue estudando