JavaScript ganha novos métodos para o Set

typescript2 min

porLucas Santos

Há 7 anos atrás, uma galera pediu para que os Sets tivessem outros métodos além dos padrões add, has e etc. Esses métodos foram pensados para casos onde você precisa trabalhar com múltiplos sets, por exemplo, criando uniões, intersecções e etc, que são operações muito comuns.

Bom, 7 anos depois, essa proposta finalmente chegou no estágio 4! Ou seja, ela vai finalmente ser implementada no JavaScript e nos browsers!

Se você não sabe o que são sets. Eles nada mais são do que estruturas parecidas com arrays, porém que só podem armazenar um valor uma única vez (já cobrimos essas técnicas aqui). É uma forma de deduplicar um array de forma eficiente.

A partir de agora, temos os seguintes novos métodos nos sets:

💡

Para deixar mais claro, vamos tomar que o set A é o Set inicial, e o set B é o set secundário

Set.prototype.intersection#

Retorna os elementos que estão tanto presentes em A e B:

const A = new Set([1, 3, 5, 7, 9]);
const B = new Set([1, 4, 9]);
console.log(A.intersection(B)); // Set(2) { 1, 9 }

Set.prototype.difference#

O oposto da intersecção, retorna itens que estão presentes em A mas não em B:

const A = new Set([1, 3, 5, 7, 9]);
const B = new Set([1, 4, 9]);
console.log(A.difference(B)); // Set(3) { 3, 5, 7 }

Set.prototype.union#

Junta ambos os sets em um único set. Uma operação que era bem chata de ser feita anteriormente porque tínhamos que ter dois sets separados, transformá-los em arrays e depois juntar em um terceiro set então esse método:

const A = new Set([2, 4, 6, 8]);
const B = new Set([1, 4, 9]);
console.log(A.union(B)); // Set(6) { 2, 4, 6, 8, 1, 9 }

É uma redução disso aqui:

const A = new Set([2, 4, 6, 8]);
const B = new Set([1, 4, 9]);
console.log(new Set([...A, ...B])); // Set(6) { 2, 4, 6, 8, 1, 9 }

Set.prototype.symmetricDifference#

Esse método é bem interessante, ele retorna elementos que estão ou em A ou em B, mas não em ambos. Se você já conhece um pouco de lógica, isso é o equivalente de um portão lógico XOR (exclusive or, ou “ou exclusivo”).

const A = new Set([2, 4, 6, 8]);
const B = new Set([1, 4, 9]);
console.log(A.symmetricDifference(B)); // Set(5) { 2, 6, 8, 1, 9 }

Set.prototype.isSubsetOf#

Uma função de verificação que checa se A está totalmente contido em B:

const A = new Set([4, 8, 12, 16]);
const B = new Set([2, 4, 6, 8, 10, 12, 14, 16, 18]);
console.log(A.isSubsetOf(B)); // true

Set.prototype.isSupersetOf#

Da mesma forma, só que ao inverso, essa função indica se todos os elementos de B estão contidos em A:

const A = new Set([4, 8, 12, 16]);
const B = new Set([2, 4, 6, 8, 10, 12, 14, 16, 18]);
console.log(B.isSupersetOf(A)); // true

Set.prototype.isDisjointFrom#

Esse é o método final para fechar o ciclo, indicando que A e B são disjuntos, ou seja, que não existe nenhum elemento de A em B.

O que também implica que não existe nenhum elemento de B em A, então essa função é idempotente

const A = new Set([2, 3, 5, 7, 11, 13, 17, 19]);
const B = new Set([1, 4, 9, 16]);
console.log(A.isDisjointFrom(B)); // true
console.log(B.isDisjointFrom(A)); // true

Conclusão#

Os novos métodos dos sets estão disponíveis nas versões:

  • 122 ou superior do Chrome
  • 122 ou superior do Edge
  • 127 ou superior do Firefox
  • 17 ou superior do Safari

Você pode ver mais detalhes no MDN