Muitos desenvolvedores limitam-se a utilização de objetos globais básicos, como strings, objetos, números, arrays e booleanos. Na maioria das vezes, isso realmente é tudo que você precisa mas, para tornar o código mais eficiente, nem sempre isso é todo o necessário.
Para isso, existem os Sets JavaScript, que tornam o seu código mais rápido a medida que ele é escalonado. O uso de sets traz resultados que seriam impossíveis de obter somente com arrays.
E como os sets são diferentes?
Bom, os arrays são coleções de dados indexados, ou seja, cada valor dos dados em um array é ordenado por um índice. Por exemplo:
let mainArray = [a, b, c, d]; console.log(mainArray.indexOf(a)); // 0 console.log(mainArray.indexOf(c)); // 2
Já os Sets são coleções codificadas. Não usam índices, mas ordenam os seus dados utilizando chaves. Seus elementos são iteráveis na ordem de inserção e não podem conter dados duplicados, ou seja, cada conjunto de dados deve ser único.
E quais são os benefícios?
- Utilizar métodos como indexOf() ou includes() para verificar a existência de um elemento em um array é muito lento;
- Nos Sets, você pode excluir o elemento pelo seu valor. Em um array, você pode utilizar o splice com base no índice do elemento, tornando-o lento pela dependência de índices;
- É mais rápido adicionar elementos aos Sets do que adicionar elementos em um array utilizando metodos como push() ou unshift();
- Um Set pode armazenar NaN;
- Sets armazenam apenas valores únicos. Se você não pode trabalhar com duplicatas, esta é uma vantagem.
O quão mais rápido são os Sets?
Os métodos que o array utiliza possuem uma complexidade de tempo linear de O (N), ou seja, o tempo de execução necessário aumenta conforme aumenta o tamanho dos dados. Mas métodos que utilizam Sets para manipulações como inserção, exclusão e pesquisa possuem uma complexidade de tempo O (1), e isso significa que o tempo de execução não varia, pois o tamanho dos dados não influencia no tempo de execução dos métodos.
Teste:
Realizando um teste, vamos criar um array e um set com um milhão de entradas cada:
let newArray = [], newSet = new Set(), n = 1000000; for (let i = 0; i < n; i++){ newArray.push(i); newSet.add(i); }
Agora, pesquisaremos o número 425123 no array e no set:
let result; console.time('Array'); result = newArray.indexOf(425123) !== -1; console.timeEnd('Array'); console.time('Set'); result = newSet.has(425123); console.timeEnd('Set');
E a saída foi:
// Array: 1.201ms // Set: 0.029ms
Gostaram deste artigo? Comente abaixo!
Referência: https://medium.com/@bretcameron/how-to-make-your-code-faster-using-javascript-sets-b432457a4a77