const map = new Map();
O que retorna um vazio Map
:
Map(0) {}
Outra maneira de criar um Map
está com valores iniciais. Veja como criar um Map
com três pares de valores-chave:
const freeCodeCampBlog = new Map([ ['name', 'freeCodeCamp'], ['type', 'blog'], ['writer', 'Tapas Adhikary'],]);
Que retorna um Map
com três elementos:
Map(3) {"name" => "freeCodeCamp", "type" => "blog", "writer" => "Tapas Adhikary"}
Como adicionar valores a um mapa
Para agregar valor a um mapa, use o set(key, value)
método.
o set(key, value)
método leva dois parâmetros, key
e value
, onde a chave e o valor podem ser de qualquer tipo, um primitivo (boolean
, string
, number
, etc.) ou um objeto:
// create a mapconst map = new Map();// Add values to the mapmap.set('name', 'freeCodeCamp');map.set('type', 'blog');map.set('writer', 'Tapas Adhikary');
Resultado:
Map(3) {"name" => "freeCodeCamp", "type" => "blog", "writer" => "Tapas Adhikary"}
Observe, se você usar a mesma chave para adicionar um valor a um Map
várias vezes, ele sempre substituirá o valor anterior:
// Add a different writermap.set('writer', 'Someone else!');
Portanto, a saída seria:
Map(3) {"name" => "freeCodeCamp", "type" => "blog", "writer" => "Someone else!"}
Como obter valores de um mapa
Para obter um valor de um Map
, use o get(key)
método:
map.get('name'); // returns freeCodeCamp
Tudo sobre as chaves do mapa
Map
as chaves podem ser de qualquer tipo, primitivas ou objetos. Esta é uma das principais diferenças entre Map
e objetos JavaScript regulares em que a chave só pode ser uma string:
// create a Mapconst funMap = new Map();funMap.set(360, 'My House Number'); // number as keyfunMap.set(true, 'I write blogs!'); // boolean as keylet obj = {'name': 'tapas'}funMap.set(obj, true); // object as keyconsole.log(funMap);
Aqui está o resultado:
Map(3) { 360 => "My House Number", true => "I write blogs!", {…} => true}
Um objeto JavaScript regular sempre trata a chave como uma string. Mesmo quando você passa um primitivo ou objeto, ele converte internamente a chave em uma string:
// Create an empty objectconst funObj = {};// add a property. Note, passing the key as a number.funObj[360] = 'My House Number';// It returns true because the number 360 got converted into the string '360' internally!console.log(funObj[360] === funObj['360']);
Propriedades e métodos do mapa
JavaScript’s Map
possui propriedades e métodos integrados que o tornam fácil de usar. Aqui estão alguns dos mais comuns:
- Use o
size
propriedade para saber quantos elementos estão em umaMap
:
console.log('size of the map is', map.size);
- Pesquise um elemento com o
has(key)
método:
// returns true, if map has an element with the key, 'John'console.log(map.has('John')); // returns false, if map doesn't have an element with the key, 'Tapas'console.log(map.has('Tapas'));
- Remova um elemento com o
delete(key)
método:
map.delete('Sam'); // removes the element with key, 'Sam'.
- Use o
clear()
método para remover todos os elementos doMap
de uma vez só:
// Clear the map by removing all the elementsmap.clear(); map.size // It will return, 0
MapIterator: keys (), values () e entradas ()
Os métodos keys()
, values()
e entries()
métodos retornam um MapIterator
, o que é excelente porque você pode usar um for-of
ou forEach
faça um loop diretamente nele.
Primeiro, crie um simples Map
:
const ageMap = new Map([ ['Jack', 20], ['Alan', 34], ['Bill', 10], ['Sam', 9]]);
console.log(ageMap.keys());// Output:// MapIterator {"Jack", "Alan", "Bill", "Sam"}
console.log(ageMap.values());// Output// MapIterator {20, 34, 10, 9}
- Obtenha todas as entradas (pares de valores-chave):
console.log(ageMap.entries());// Output// MapIterator {"Jack" => 20, "Alan" => 34, "Bill" => 10, "Sam" => 9}
Como iterar em um mapa
Você pode usar o forEach
ou for-of
loop para iterar sobre um Map
:
// with forEachageMap.forEach((value, key) => { console.log(`${key} is ${value} years old!`);});// with for-offor(const [key, value] of ageMap) { console.log(`${key} is ${value} years old!`);}
O resultado será o mesmo em ambos os casos:
Jack is 20 years old!Alan is 34 years old!Bill is 10 years old!Sam is 9 years old!
Como converter um objeto em um mapa
Você pode encontrar uma situação em que precise converter um object
para um Map
como estrutura. Você pode usar o método, entries
do Object
fazer isso:
const address = { 'Tapas': 'Bangalore', 'James': 'Huston', 'Selva': 'Srilanka'};const addressMap = new Map(Object.entries(address));
Como converter um mapa em um objeto
Se você quiser fazer o inverso, pode usar o fromEntries
método:
Object.fromEntries(map)
Como converter um mapa em uma matriz
Existem algumas maneiras de converter um mapa em uma matriz:
const map = new Map();map.set('milk', 200);map.set("tea", 300);map.set('coffee', 500);console.log(Array.from(map));
- Usando o operador de propagação:
console.log([...map]);
Mapa x objeto: quando você deve usá-los?
Map
tem características de ambos object
e array
. Contudo, Map
é mais como um object
do que array
devido à natureza do armazenamento de dados no key-value
formato.
A semelhança com os objetos termina aqui. Como você viu, Map
é diferente de várias maneiras. Então, qual você deve usar e quando? Como você decide?
Usar Map
quando:
- Suas necessidades não são tão simples. Você pode querer criar chaves que não sejam strings. Armazenar um objeto como chave é uma abordagem muito poderosa.
Map
oferece essa capacidade por padrão. - Você precisa de uma estrutura de dados onde os elementos possam ser ordenados. Objetos regulares não mantêm a ordem de suas entradas.
- Você está procurando flexibilidade sem depender de uma biblioteca externa como
lodash
. Você pode acabar usando uma biblioteca comolodash
porque não encontramos métodos comohas()
,values()
,delete()
, ou uma propriedade comosize
com um objeto regular.Map
torna isso fácil para você, fornecendo todos esses métodos por padrão.
Use um objeto quando:
- Você não tem nenhuma das necessidades listadas acima.
- Você confia em
JSON.parse()
como umMap
não pode ser analisado com ele.
UMA Set
é uma coleção de elementos exclusivos que podem ser de qualquer tipo. Set
também é uma coleção ordenada de elementos, o que significa que os elementos serão recuperados na mesma ordem em que foram inseridos.
UMA Set
em JavaScript se comporta da mesma maneira que um conjunto matemático.
Como criar e inicializar um conjunto
Um novo Set
pode ser criado assim:
const set = new Set();console.log(set);
E a saída será um vazio Set
:
Set(0) {}
Veja como criar um Set
com alguns valores iniciais:
const fruteSet = new Set(['🍉', '🍎', '🍈', '🍏']);console.log(fruteSet);
Resultado:
Set(4) {"🍉", "🍎", "🍈", "🍏"}
Definir propriedades e métodos
Set
possui métodos para adicionar um elemento a ele, excluir elementos dele, verificar se um elemento existe nele e limpá-lo completamente:
- Use o
size
propriedade para saber o tamanho doSet
. Ele retorna o número de elementos nele:
set.size
- Use o
add(element)
método para adicionar um elemento aoSet
:
// Create a set - saladSetconst saladSet = new Set();// Add some vegetables to itsaladSet.add('🍅'); // tomatosaladSet.add('🥑'); // avocadosaladSet.add('🥕'); // carrotsaladSet.add('🥒'); // cucumberconsole.log(saladSet);// Output// Set(4) {"🍅", "🥑", "🥕", "🥒"}
Eu amo pepinos! Que tal adicionar mais um?
Oh não, eu não posso – Set
é uma coleção de único elementos:
saladSet.add('🥒');console.log(saladSet);
A saída é a mesma de antes – nada foi adicionado ao saladSet
.
- Use o
has(element)
método para pesquisar se temos uma cenoura (🥕) ou brócolis (🥦) noSet
:
// The salad has a 🥕, so returns trueconsole.log('Does the salad have a carrot?', saladSet.has('🥕'));// The salad doesn't have a 🥦, so returns falseconsole.log('Does the salad have broccoli?', saladSet.has('🥦'));
- Use o
delete(element)
método para remover o abacate (🥑) doSet
:
saladSet.delete('🥑');console.log('I do not like 🥑, remove from the salad:', saladSet);
Agora nossa salada Set
é o seguinte:
Set(3) {"🍅", "🥕", "🥒"}
- Use o
clear()
método para remover todos os elementos de umSet
:
saladSet.clear();
Como iterar em um conjunto
Set
tem um método chamado values()
que retorna um SetIterator
para obter todos os seus valores:
// Create a Setconst houseNos = new Set([360, 567, 101]);// Get the SetIterator using the `values()` methodconsole.log(houseNos.values());
Resultado:
SetIterator {360, 567, 101}
Podemos usar um forEach
ou for-of
faça um loop para recuperar os valores.
Curiosamente, o JavaScript tenta fazer Set
compatível com Map
. É por isso que encontramos dois dos mesmos métodos que Map
, keys()
e entries()
.
Como Set
não tem chaves, o keys()
método retorna um SetIterator
para recuperar seus valores:
console.log(houseNos.keys());// Output// console.log(houseNos.keys());
Com Map
, a entries()
método retorna um iterador para recuperar pares de valores-chave. Novamente, não há chaves em um Set
, tão entries()
retorna um SetIterator
para recuperar os pares valor-valor:
console.log(houseNos.entries());// Output// SetIterator {360 => 360, 567 => 567, 101 => 101}
Como enumerar em um conjunto
Podemos enumerar sobre um conjunto usando forEach
e for-of
rotações:
// with forEachhouseNos.forEach((value) => { console.log(value);});// with for-offor(const value of houseNos) { console.log(value); }
O resultado de ambos é:
360567101
Conjuntos e matrizes
Uma matriz, como um Set
, permite adicionar e remover elementos. Mas Set
é bem diferente e não se destina a substituir matrizes.
A principal diferença entre um array e um Set
é que os arrays permitem elementos duplicados. Ademais, alguns dos Set
operações como delete()
são mais rápidas do que operações de array como shift()
ou splice()
.
Imagine Set
como uma extensão de uma matriz regular, apenas com mais músculos. o Set
estrutura de dados não é uma substituição do array
. Ambos podem resolver problemas interessantes.
Como converter um conjunto em um array
Convertendo um Set
em uma matriz é simples:
const arr = [...houseNos];console.log(arr);
Valores únicos de uma matriz usando o Conjunto
Criando um Set
é uma maneira realmente fácil de remover valores duplicados de uma matriz:
// Create a mixedFruit array with a few duplicate fruitsconst mixedFruit = ['🍉', '🍎', '🍉', '🍈', '🍏', '🍎', '🍈',];// Pass the array to create a set of unique fruitsconst mixedFruitSet = new Set(mixedFruit);console.log(mixedFruitSet);
Resultado:
Set(4) {"🍉", "🍎", "🍈", "🍏"}
Conjunto e objeto
UMA Set
pode ter elementos de qualquer tipo, até mesmo objetos:
// Create a person objectconst person = { 'name': 'Alex', 'age': 32 };// Create a set and add the object to itconst pSet = new Set();pSet.add(person);console.log(pSet);
Resultado:
Nenhuma surpresa aqui – o Set
contém um elemento que é um objeto.
Vamos alterar uma propriedade do objeto e adicioná-la ao conjunto novamente:
// Change the name of the personperson.name="Bob";// Add the person object to the set againpSet.add(person);console.log(pSet);
Qual você acha que será o resultado? Dois person
objetos ou apenas um?
Aqui está o resultado:
Set
é uma coleção de elementos únicos. Ao alterar a propriedade do objeto, não alteramos o próprio objeto. Conseqüentemente Set
não permitirá elementos duplicados.
Set
é uma ótima estrutura de dados para usar além de arrays JavaScript. No entanto, ele não tem uma grande vantagem sobre os arrays regulares.
Usar Set
quando você precisa manter um conjunto distinto de dados para realizar operações definidas como union
, intersection
, difference
, e assim por diante.
Em suma
Aqui está um repositório GitHub para encontrar todo o código-fonte usado neste artigo. Se você achou útil, mostre seu apoio dando uma estrela: https://github.com/atapas/js-collections-map-set
Você pode ler mais sobre os Map
e Set
estruturas de dados aqui:
Você também pode gostar de alguns dos meus outros artigos:
Se este artigo foi útil, compartilhe-o para que outras pessoas também possam lê-lo. Você pode me @ no Twitter (@tapasadhikary) com comentários ou fique à vontade para me seguir.