Matriz JavaScript para definir

144

O MSDN faz referência à abstração da coleção Set do JavaScript . Eu tenho uma matriz de objetos que gostaria de converter em um conjunto para poder remover ( .delete()) vários elementos pelo nome:

var array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

Como faço para converter essa matriz em um conjunto? Mais especificamente, é possível fazer isso sem iterar sobre a matriz acima? A documentação está relativamente ausente (suficiente para conjuntos instanciados; não para conversões - se possível).

Também posso estar pensando na conversão para um mapa , para remoção por chave. O que estou tentando realizar é uma coleção iterável que pode ser acessada ou modificada através do acesso aos elementos principalmente por meio de uma chave (em oposição ao índice).

A conversão de uma matriz para outra é o objetivo final.

Thomas
fonte
1
soa como um velho objeto simples irá trabalhar para você ...
dandavis
3
@ Thomas: então estou faltando alguma coisa, que eu quero aprender. Qual é a diferença entre var s = new Set (), adicionando objetos e emitindo s.delete (qualquer que seja) - e var o = {1: 'aaa', 2: 'bbbb' ...} e emitindo delete (o [ '1'])?
Veverke
1
@Veverke que foi mais descritivo do que o seu comentário inicial (+1). Obrigado. Mas, novamente, é possível fazer isso sem iterar sobre a matriz para adicionar o conteúdo da matriz ao objeto e manter uma lista como uma estrutura acessível por chave? Parece que você tem uma ideia. Eu não me importaria de vê-lo em um formato de resposta se você tiver tempo para elaborar.
Thomas
2
Esse objeto de matriz não é legal, pois {"bob", "dole"}não é um objeto válido.
Alnitak
1
O @Veverke ES6 Sete Mapa implementação "pura" dessas construções de dados que não sofrem os problemas que Objectpodem quando as coisas são adicionadas ao seu protótipo.
Alnitak

Respostas:

203

Apenas passe a matriz para o construtor Set. O construtor Set aceita um iterableparâmetro. O objeto Array implementa o iterableprotocolo, portanto é um parâmetro válido.

var arr = [55, 44, 65];
var set = new Set(arr);
console.log(set.size === arr.length);
console.log(set.has(65));

Veja aqui

levi
fonte
estritamente correta, embora eu tenha hesitado em adicionar uma resposta a mim mesmo desde que os dados do OP é mal formado e é, portanto, claro exatamente o que ele espera
Alnitak
10
Isso não funciona no IE11. Não suporta este construtor. Eu o evitaria a menos que você saiba quais navegadores seus usuários vão usar.
Eric
10

Se você começar com:

let array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

E você quer um conjunto de, digamos, nomes, você faria:

let namesSet = new Set(array.map(item => item.name));
Ryan Shillington
fonte
3

O que levi disse sobre a passagem para o construtor está correto, mas você também pode usar um objeto.

Acho que o que Veverke está tentando dizer é que você poderia facilmente usar a deletepalavra - chave em um objeto para obter o mesmo efeito.

Eu acho que você está confuso com a terminologia; As propriedades são componentes do objeto que você pode usar como índices nomeados (se desejar pensar dessa maneira).

Tente algo como isto:

var obj = {
    "bob": "dole",
    "mr.": "peabody",
    "darkwing": "duck"
};

Então, você poderia fazer isso:

delete obj["bob"];

A estrutura do objeto seria então:

{
    "mr.": "peabody",
    "darkwing": "duck"
}

Qual tem o mesmo efeito.

AstroCB
fonte
1
Obrigado Astro :-). De fato, isso abriu a questão: "qual é a diferença entre um objeto Set e um objeto simples"? Embora, como observei nos comentários acima, "Set" seja um tipo de finalização que ofereça o "bom ter funcionalidade" de "clear".
Veverke
Em resumo, acho que o título do post deve ser alterado para "Qual é a diferença entre um objeto Set e um objeto simples em javascript" e observe que "Ao tentar conseguir isso e aquilo ... acabei me perguntando qual é a diferença entre ...
Veverke
@Veverke "o que é a diferença entre um objeto Set e um objeto simples", pode apenas ler o doc ..
Hacketo
1
@Hacketo: você encontra outro que não seja Set fornecendo "Clear" em sua API?
Veverke
1
Esta é uma resposta interessante - pense que merece mais crédito do que recebeu. Faça-me pensar. Obrigado!
Thomas
2

Por definição "Um conjunto é uma coleção de valores, onde cada valor pode ocorrer apenas uma vez". Portanto, se sua matriz tiver valores repetidos, apenas um valor entre os valores repetidos será adicionado ao seu conjunto.

var arr = [1, 2, 3];
var set = new Set(arr);
console.log(set); // {1,2,3}


var arr = [1, 2, 1];
var set = new Set(arr);
console.log(set); // {1,2}

Portanto, não converta para definir se você repetiu valores em sua matriz.

Sortee de Ashlesh
fonte