Explorando ES6: Set e WeakSet

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

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *