- Publicado em
Implementando Mapa e Conjunto (Map/Set) com NodeJS e Javascript
- Estrutura de Dados e Algoritmos - Um Resumo dos Mais Utilizados
- Implementando Array com NodeJS e Javascript
- Implementando Lista Ligada (Linked List) com NodeJS e Javascript
- Implementando Pilha (Stack) com NodeJS e Javascript
- Implementando Fila (Queue) com NodeJS e Javascript
- Implementando Árvore (Tree) com NodeJS e Javascript
- Implementando Grafo (Graph) com NodeJS e Javascript
- Implementando Tabela Hash (Hash Table) com NodeJS e Javascript
- Implementando Heap com NodeJS e Javascript
- Implementando Fila de Prioridade (Priority Queue) com NodeJS e Javascript
- Implementando Mapa e Conjunto (Map/Set) com NodeJS e Javascript
A Teoria da Coisa
Maps e Sets são estruturas de dados muito conhecidas e geralmente usamos no dia-a-dia sem nem lembrar que estamos usando estruturas que foram feitas pra resolver alguns tipos de problemas igual um array ou tree (árvores)... Os Maps funcionam com uma estrutura de chave-valor
, onde as chaves são únicas. Já os Sets são usados para criar uma coleção onde os valores são únicos. No mundo do NodeJS/Javascript tivemos na atualização do ECMAScript 6 (ES6), algumas ajudas que deixaram melhor e trouxeram formas mais eficientes de manipular os Maps e os Sets.

Mão na Massa
Um Map
é uma coleção de pares chave-valor
onde cada chave é única e tem o seu valor, e seu valor pode ser de qualquer tipo (um número, um objeto, etc), e diferente dos objetos tradicionais em JavaScript, as chaves de um Map podem ser de qualquer tipo também, incluindo objetos, funções ou outros tipos primitivos.
Um Set é uma coleção de valores únicos. Assim como os Maps, os valores em um Set podem ser de qualquer tipo. Sets são particularmente úteis quando você precisa garantir que não haja duplicatas em uma coleção.

Agora a Prática
Agora abre aí o seu VSCode ou sua IDE favorita e vamos lá, crie um arquivo chamado map-and-set.js
e cola o código abaixo pra começar com o Map:
const map = new Map()
map.set('key', 'value')
map.set({}, 'object as key')
map.set(() => {}, 'function as key')
map.set(1, 'number as key')
map.set('key2', { key: 'key in the map value object' })
console.log(`map:`, map)
console.log(`map get "key":`, map.get('key'))
console.log(`map has "key2":`, map.has('key2'))
console.log(`map get "key2":`, map.get('key2'))
map.delete('key')
console.log(`map deleted "key":`, { map })
Explicando o Map acima:
- Primeiro criamos um novo Map com
const map = new Map()
. map.set('key', 'value')
: Adiciona um novo parchave-valor
ao Map, a chave é uma stringkey
e o valor uma outra stringvalue
.map.set({}, 'object as key')
: Adiciona um novo parchave-valor
ao Map, onde a chave é um objeto vazio, e o valor é uma string.map.set(() => {}, 'function as key')
: Adiciona um novo parchave-valor
ao Map, onde a chave é uma função vazia, e o valor é uma string.map.set(1, 'number as key')
: Adiciona um novo parchave-valor
ao Map, onde a chave é um número1
, e o valor é uma string.map.set('key2', { key: 'key in the map value object' })
: Adiciona um novo parchave-valor
ao Map, onde a chave é uma stringkey2
, e o valor é um objeto com uma chavekey
e um valor string.
Depois disso temos alguns console.log
para mostrar o que está acontecendo com o Map, onde:
map
: Mostra o Map completo.map.get('key')
: Pega o valor da chavekey
.map.has('key2')
: Verifica se a chavekey2
existe no Map e retornatrue
oufalse
.map.get('key2')
: Pega o valor da chavekey2
.map.delete('key')
: Deleta a chavekey
do Map se ela existir.
Agora vamos com o Set:
const set = new Set()
set.add('valor1')
set.add('valor2')
set.add('valor3')
set.add('valor4')
set.add('valor5')
console.log(`set:`, set)
console.log(`set has "valor2":`, set.has('valor2'))
console.log(`set keys:`, set.keys())
set.add('valor1')
console.log(`set add "valor1" again:`, set)
set.delete('valor1')
console.log(`set deleted "valor1":`, set)
Explicando o Set acima:
- Primeiro criamos um novo Set com
const set = new Set()
. set.add('valor1')
: Adiciona um novo valor ao Set, o valor é a stringvalor1
.set.add('valor2')
: Adiciona um novo valor ao Set, o valor é a stringvalor2
.set.add('valor3')
: Adiciona um novo valor ao Set, o valor é a stringvalor3
.set.add('valor4')
: Adiciona um novo valor ao Set, o valor é a stringvalor4
.set.add('valor5')
: Adiciona um novo valor ao Set, o valor é a stringvalor5
.
Depois disso temos alguns console.log
para mostrar o que está acontecendo com o Set, onde:
set
: Mostra o Set completo.set.has('valor2')
: Verifica se o valorvalor2
existe no Set e retornatrue
oufalse
.set.keys()
: Retorna um iterador com as chaves do Set.set.add('valor1')
: Vai tentar adicionar o valorvalor1
de novo no Set, e logo em seguida fazemos um log onde vemos que o valor não é adicionado pois ele já existe no Set e não temos valores duplicados.set.delete('valor1')
: Deleta o valorvalor1
do Set se ele existir.
Aonde Você Pode Usar/Ver
Mapeamento com Maps
Maps servem onde precisamos ter chave-valor
que precisam ser acessadas e atualizadas de forma fácil e rápida, um exemplo pode ser quando trabalhamos com caches de dados, onde podemos usar Maps e ter uma relação de chave-valor pra recuperar de forma rápida as informações.
Gerenciamento de Dados Únicos com Sets
Você pode encontrar e utilizar os Sets para manipular listas de itens em casos onde a lista não deve conter itens duplicados, como em casos de gerenciamento de sessões de usuários ou um exemplo mais simples seria uma listas de tarefas, afinal não quereoms incluir a mesma tarefa 2x/3x na lista (em alguns casos né, aqui é só de exemplo).
Dicas
- Use os Maps sempre que precisar de um tipo
chave-valor
que não seja apenas strings ou símbolos. - Use os Sets quando precisar garantir que os elementos de uma coleção não tenha itens duplicados.
- Se precisar trabalhar com grandes volumes de dados, você precisa pensar na memória e desempenho, pois tanto Maps quanto Sets podem crescer muito e talvez nesses casos você precise considerar uma outra estrutura de dados ou trabalhar com mais de uma estrutura ao mesmo tempo pra que uma auxilie a outra.
Considerações do Jon
Em muitas linguagens de programação já temos alguma lib ou implementação na própria linguagem dos Maps e Sets, a questão é lembrar de quando usar e tentar se perguntar se realmente precisa de um Map ou Set, ou se pode resolver o problema de outra forma.
E Você?!
Já criou/utilizou algo parecido nos seus projetos ou no seu trampo? Compartilhe aqui nos comentários suas dúvidas, se já fez, experiências, desafios, dicas, etc!! Vamos explorar esses conceitos juntos, ah e se viu algum bug, erro, melhoria, também comenta aí!