Tempo de leitura: menos de 1 minuto
No EcmaScript 6 foram introduzidas importantes coleções de dados que antes não existiam, uma delas, já discutida aqui no blog, foi Map e WeakMap. Hoje, discuto um pouco mais sobre duas novas e relevantes coleções que foram introduzidas no EcmaScript 6: o Set e o WeakSet.
Set
Set é uma coleção de dados onde não se permite que valor algum seja duplicado. Essa coleção também mantém a ordem dos itens conforme são inseridos e permite qualquer tipo de valor como um item.
https://gist.github.com/mateusmarquezini/0acf4375ecdc41b7d42bf298398ddb91
No exemplo acima vimos como Set é poderoso. Inserimos 2 itens duplicados em nosso conjunto e ele mesmo se encarregou de desconsiderá-los e removê-los de nosso set de elementos.
Você até pode arriscar a inserção de valores duplicados, porém, por debaixo dos panos, o Set irá ignorá-los!
O construtor de Set nos permite inicializá-los com vários valores pré-definidos, para isso basta utilizarmos valores dentro de um Array.
https://gist.github.com/mateusmarquezini/2d81b933992ab460aaddcb414bb9f47c
Métodos de Set
-
add()
Há duas maneiras de adicionar elementos em um Set. Como vimos na introdução de Set, podemos adicionar elementos através do construtor em sua inicialização ou através do método add().
https://gist.github.com/mateusmarquezini/4d4a4312804523c9218a03acf1c5fadf
-
delete()
Para removermos elementos de um Set, podemos usar o método delete().
https://gist.github.com/mateusmarquezini/c4670a2978c7321ce0eb3ec16f7aaf97
-
clear()
Se for necessário a remoção de todos os elementos de um Set deixando-o vazio, podemos usar o método clear() para isso.
https://gist.github.com/mateusmarquezini/07dbcb0a4114b355ba8041d077000ad6
-
size()
Para sabermos o tamanho de um Set é simples, só invocarmos o método size().
https://gist.github.com/mateusmarquezini/5dad39535f73e986831566e17de60627
-
has()
Para checarmos se um determinado elemento encontra-se em um Set, podemos utilizar o método has().
https://gist.github.com/mateusmarquezini/4666ab50b906b2cb771a2d39a2bf0020
Para visualização dos dados de um Set, podemos usar os métodos entries() e values().
O output do método entries() é curioso pois lembra um mapa com chave/valor, o que acontece aqui é que esse método retorna um Iterator, assim como values(). Esse Iterator contém um array de [valor, valor] para cada elemento de Set seguindo sua ordem de inserção. Para o objeto Set não há chave/valor como em Map, contudo, para manter a API similar, cada entry possui o mesmo valor em value.
https://gist.github.com/mateusmarquezini/664003d7d3b3f827ba18c869fc696820
Para iterarmos os elementos de um Set, podemos usar tanto for.. of quanto forEach.
https://gist.github.com/mateusmarquezini/bb19a95d2ef2f8940e3456ba2a6805cf
Como visto, os dois métodos produzem a mesma saída sempre respeitando a ordem de inserção.
WeakSet
WeakSet é um conjunto de elementos que lembra bastante o WeakMap, já falado em outro post aqui.
O que difere um WeakSet de um Set é:
- Ele permite que apenas objetos sejam inseridos em sua coleção;
- Ele não é um objeto iterável como Set;
- Não é possível remover todos os elementos de uma só vez.
Lembrando que assim como WeakMap, os objetos inseridos aqui são fracamente mantidos, com isso o Garbage Colector coleta os elementos, uma vez que não haja mais referência ao mesmo. Assim que o objeto é coletado pelo GC, ele é removido de um WeakSet.
Métodos de WeakSet
WeakSet não é composto de muitos métodos como Set, portanto, aqui não temos muitas opções para manipular esse objeto. São basicamente três métodos e nenhum deles é novidade para nós em relação ao seus respectivos comportamentos. São eles: add(), has() e delete().
https://gist.github.com/mateusmarquezini/d995438333a63ac1ea4b10429c3884a3
Para mais informações, acesse: Set – MDN / WeakSet – MDN