DEV Community

Phyllipe Bezerra
Phyllipe Bezerra

Posted on

Estruturas de Dados: Entendendo e implementando Maps com Typescript

Vamos lá

Vamos lá, sobre Map: seu conceito é basicamente uma estrutura chave-valor, ou seja, teremos chaves únicas que são atreladas a determinados valores, bem como o nosso conhecido objeto do javascript mas com algumas diferenças:

Tipos das chaves

No objeto o tipo de dado que as chaves podem assumir estão restritos a números inteiros, strings e símbolos. Já no Map o tipo poe ser praticamente qualquer um (inteiros, strings, arrays, objetos, etc...)

const obj = {
    1: "Chave Número Inteiro",
    "A": "Chave String",
    [Symbol()]: "Chave Símbolo",

    [[1, 2, 3]]: "Chave Array" // Erro!
    [{ chave: "valor" }]: "Chave Objeto" // Erro!
};
Enter fullscreen mode Exit fullscreen mode

Ordem dos elementos

No objeto a ordem dos elementos não é obrigatóriamente preservada, já nos Maps a ordem é preservada.

const obj = {
    "A": "Item 1",
    2: "Item 2",
    1: "Item 3"
};

console.log(Object.keys(obj)); // ["1", "2", "A"] 
Enter fullscreen mode Exit fullscreen mode

Para mais detalhes sobre o Map e suas diferenças é bom dar uma olhada na documentação:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

Map

Então vamos logo por a mão no código, vamos passar por cada método do Map e explicar a função de cada um, blz?

Definição

Para definir um Map é bem simples, para o nosso exemplo vamos criar um Map que servirá para guardar o nome e o email de diferentes alunos, o nome do aluno será a chave única que estará atrelada ao email do aluno.

// Criando um Map vazio, o primeiro tipo é o tipo da chave
// E o segundo tipo é o tipo do valor.
const alunos = new Map<string, string>();
Enter fullscreen mode Exit fullscreen mode

Adicionando Valores

Agora precisamos adicionar os alunos nessa estrutura, certo? Para isso o Set conta com o método set que recebe dois parâmetros:

  • Map.set(key, value) - key é a chave que queremos atribuir o valor value.

Então digamos que precisamos adicionar 2 alunos novos e seus respectivos emails:

  1. carlos, carlos@estudante.com
  2. bianca, bianca@aluna.com

Para isso, basta fazer:

alunos.set("carlos", "carlos@estudante.com");
alunos.set("bianca", "bianca@aluna.com");
Enter fullscreen mode Exit fullscreen mode

Recuperando Valores

Digamos agora que precisamos verificar qual o email de Bianca, para enviar as notas da prova para ela. Para isso podemos usar o método get do Map;

  • Map.get(key) - key é a chave do qual você deseja pegar o valor, é retornado então o valor caso exista, caso não exista é retornado undefined.
// Pegando o email dos alunos

const emailBianca = alunos.get("bianca");

console.log(emailBianca); // "bianca@aluna.com"

// Pegando email de um aluno que não está cadastrado
const emailFulano = alunos.get("fulano");

console.log(emailFulano); // undefined
Enter fullscreen mode Exit fullscreen mode

Verificando Valores

Para prevenir esse problema de pegar o valor de uma chave que não existe, nós podemos simplesmente verificar se a chave realmente existe no Map, e para isso podemos usar o método has:

  • Map.has(key) - Verifica se no Map existe a chave key cadastrada e retorna true caso exista, false caso não exista.
// Verificando se o Fulano está cadastrado
const fulanoExiste = alunos.has("fulano");

console.log(fulanoExiste); // false
Enter fullscreen mode Exit fullscreen mode

Removendo Chaves e Valores

Agora caso seja necessário remover um aluno cadastrado, tanto sua chave (nome) quanto seu valor (email), podemos utilizar o método delete:

  • Map.delete(key) - Remove a chave key e seu valor atrelado, retorna true caso a chave exista e tenha sido removida ou false caso a chave não exista e nada tenha sido removido.
// Removendo carlos
const carlosRemovido = alunos.delete("carlos");

console.log(carlosRemovido); // true

// Removendo um aluno que não existe
const fulanoRemovido = alunos.delete("fulano");

console.log(fulanoRemovido); // false
Enter fullscreen mode Exit fullscreen mode

Verificando Tamanho e Limpando

Podemos também utilizar mais uma propriedade e um método bem úteis. A propriedade size e o método clear:

  • Map.size - Retorna um número inteiro contendo a quantidade de chaves presentes no Map.
  • Map.clear() - Limpa todos os valores do Map, ao final o Map não terá mais nada cadastrado nele.
// Verificando o tamanho do nosso map de alunos
// Tinhamos cadastrado 2 alunos no começo e removemos carlos
// anteriormente, então deve ter somente 1 aluno.

const quantidadeDeAlunos = alunos.size;

console.log(quantidadeDeAlunos); // 1
Enter fullscreen mode Exit fullscreen mode

E agora, adivinha? Virou o ano, nova turma e precisamos limpar o Set para poder cadastrar os novos alunos que chegarão, então:

// Limpando nosso set
alunos.clear();

// Verificando o tamanho
console.log(alunos.size); // 0
Enter fullscreen mode Exit fullscreen mode

E é isso, bem simples né? Para mais informações sobre a estrutura de dados e detalhes mais específicos sempre recomendo que leiam a documentação, segue o link:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs