ti-enxame.com

Maneiras de criar um conjunto em JavaScript?

No Eloquent JavaScript, capítulo 4, um conjunto de valores é criado criando um objeto e armazenando os valores como nomes de propriedades, atribuindo valores arbitrários (por exemplo, true) como valores de propriedades. Para verificar se o valor já está contido no conjunto, o operador in é usado:

var set = {};

if (!'Tom' in set) { 
  set.Tom = true;
}

Isso é JavaScript idiomático? Não estaria usando uma matriz ainda melhor?

var set = [];

if (!'Tom' in set) { 
  set.Push = 'Tom';
}
71
helpermethod

Conjuntos estão agora disponíveis no ES2015 (também conhecido como ES6, ou seja, ECMAScript 6). O ES6 é o padrão atual para JavaScript desde junho de 2015.

O ECMAScript 6 possui o conjunto de estruturas de dados que funciona para valores arbitrários, é rápido e manipula o NaN corretamente. - Axel Rauschmayer , Explorando ES6

Primeiros dois exemplos de Axel Rauschmayer book Exploring ES6 :

Gerenciando elementos únicos:

> let set = new Set();
> set.add('red')

> set.has('red')
true
> set.delete('red')
true
> set.has('red')
false

Determinando o tamanho de um conjunto e limpando-o:

> let set = new Set();
> set.add('red')
> set.add('green')

> set.size
2
> set.clear();
> set.size
0

Gostaria de verificar Explorando ES6 se você quiser saber mais sobre conjuntos em JavaScript. O livro é gratuito para leitura on-line, mas se você quiser apoiar o autor Dr. Axel Rauschmayer , você pode comprar o livro por cerca de US $ 30.

Se você deseja usar Sets e ES6 agora, pode usar Babel , o transpiler ES6 para ES5 e seus polyfills.

Editar: a partir de 6 de junho de 2017, a maioria dos principais navegadores tem suporte completo ao conjunto em suas versões mais recentes (exceto IE 11). Isso significa que você pode não precisar do babel se não se importar em oferecer suporte a navegadores mais antigos. Se você quiser ver compatibilidade em diferentes navegadores, incluindo a verificação atual do navegador tabela de compatibilidade ES6 do Kangax .

83
John

Eu uso objetos dict como conjuntos. Isso funciona com seqüências de caracteres e números, mas suponho que causaria problemas se você quisesse ter um conjunto de objetos usando operadores de comparação e igualdade personalizados:

Criando um conjunto:

var example_set = 
{
    'a':true,
    'b':true,
    'c':true
}

Teste para inclusão em um conjunto

if( example_set['a'] ){
    alert('"a" is in set');
}

Adicionando um elemento a um conjunto

example_set['d'] = true;

Removendo um elemento de um conjunto

delete example_set['a'];

32
Chris Dutrow

Os conjuntos não permitem entradas duplicadas e normalmente não garantem pedidos predefinidos. As matrizes fazem as duas coisas, violando assim o que significa ser um conjunto (a menos que você faça verificações adicionais).

15
Jon Newmuis

A primeira maneira é o JavaScript idiomático.

Sempre que você quiser armazenar um par chave/valor, você deve usar um objeto JavaScript. Quanto aos arrays, existem vários problemas:

  1. O índice é um valor numérico.

  2. Não há maneira fácil de verificar se um valor está em uma matriz sem passar pelo loop.

  3. Um conjunto não permite duplicatas. Uma matriz faz.

11
Justin Niessner

Se você quiser criar um conjunto de uma matriz, simplesmente faça:

let arr = [1, 1, 2, 1, 3];
let mySet = new Set(arr); // Set { 1, 2, 3 }

Essa é uma sintaxe de açúcar que eu imaginava ao programar em Python, tão feliz que o ES6 finalmente tornou possível fazer a mesma coisa.

NOTA: entendi que o que eu disse não respondeu diretamente à sua pergunta. A razão pela qual você tem esse "hack" no ES5 é porque o tempo de pesquisa em um objeto por chaves é significativamente mais rápido (O (1)) do que em uma matriz (O (n)). Em aplicativos críticos para o desempenho, você pode sacrificar esse pouco de legibilidade ou intuição para obter melhor desempenho.

Mas ei, bem-vindo a 2017, onde você pode usar --- Set adequado em todos os principais navegadores modernos agora!

8
benjaminz

Define em ES6/ES2015:

ES6/ES2015 agora foi construído em conjuntos. Um conjunto é uma estrutura de dados que permite o armazenamento de valores únicos de qualquer tipo, sejam valores primitivos ou referências a objetos. Um conjunto pode ser declarado usando o construtor ES6 construído em conjunto da seguinte maneira:

const set = new Set([1, 2, 3, 4, 5]);

Ao criar um conjunto usando o construtor Set, nosso objeto conjunto recém-criado é herdado do Set.prototype. Isso tem todos os tipos de métodos e propriedades auxiliares. Isso permite que você faça facilmente o seguinte:

Exemplo:

const set = new Set([1, 2, 3, 4, 5]);

// checkout the size of the set
console.log('size is: ' + set.size);

// has method returns a boolean, true if the item is in the set
console.log(set.has(1));

// add a number
set.add(6);

// delete a number
set.delete(1);

// iterate over each element using a callback
set.forEach((el) => {
  console.log(el);
});

// remove all the entries from the set
set.clear();

Compatibilidade do navegador:

Todos os principais navegadores agora suportam totalmente os conjuntos, exceto IE onde alguns recursos estão faltando. Para referência exata, consulte o documento mdn docs .

5
Willem van der Veen

Você pode tentar Buckets , é uma biblioteca de estrutura de dados javascript e tem tudo o que precisa para manipular conjuntos.

3
Daniel

Existem dois problemas com o uso de objetos javascript nus para emular conjuntos: primeiro, um objeto pode ter uma propriedade herdada que iria estragar o operador "in" e segundo, você só pode armazenar valores escalares dessa forma, fazendo com que um conjunto de objetos não seja possível. Portanto, uma implementação realista de Conjuntos deve fornecer métodos add e contains em vez de simples in e atribuições de propriedade.

3
georg