Como converter Set to Array?

469

Set parece ser uma boa maneira de criar matrizes com elementos exclusivos garantidos, mas não expõe nenhuma boa maneira de obter propriedades, exceto o gerador [Set] .values, que é chamado de uma maneira estranha mySet.values.next().

Isso teria sido bom, se você pudesse chamar mapoutras funções semelhantes em Sets. Mas você não pode fazer isso também.

Eu tentei Array.from, mas parece estar convertendo apenas objetos do tipo array (NodeList e TypedArrays?) Para Array. Outra tentativa: Object.keysnão funciona para Sets, e Set.prototype não possui um método estático semelhante.

Então, a pergunta: existe algum método embutido conveniente para criar uma matriz com valores de um determinado conjunto? (A ordem do elemento realmente não importa).

se essa opção não existir, talvez haja uma única linha idiomática para fazer isso? como, usando for...ofou similar?

c69
fonte

Respostas:

850

se essa opção não existir, talvez haja uma única linha idiomática para fazer isso? como, usando para ... de ou similar?

De fato, existem várias maneiras de converter um conjunto em uma matriz :

usando Array.from

let array = Array.from(mySet);

Simplesmente spreadingo conjunto em uma matriz

let array = [...mySet];

À moda antiga, iterando e empurrando para uma nova matriz (os conjuntos têm forEach)

let array = [];
mySet.forEach(v => array.push(v));

Anteriormente, usando a sintaxe de compreensão de matriz não padrão e agora obsoleta:

let array = [v for (v of mySet)];
adeneo
fonte
7
Isso não funciona no Safari (8) ou Chrome (41). Mas ele funciona no Firefox (35).
425nesp
2
var array = [v for (v of mySet)];não funciona no chrome 46
Eric
18
Eu acho que a maneira mais elegante é simples [...mySet].
Wojciech Bednarski #
18
@WojciechBednarski l33t não é elegante . Se algum dos exemplos é esse, éArray.from(mySet);
Buffalo
3
Só queria acrescentar que [...mySet]há problemas ao compilar usando o Typescript (consulte esse problema ), portanto, é mais seguro usar Array.from(mySet)se você pretende converter para o Typescript em um futuro próximo.
Ivan Gozali
65

via https://speakerdeck.com/anguscroll/es6-uncensored por Angus Croll

Acontece que podemos usar o spreadoperador:

var myArr = [...mySet];

Ou, alternativamente, use Array.from:

var myArr = Array.from(mySet);
c69
fonte
1
por que um voto negativo? existem problemas com esta abordagem? Ou alguém tentou executar esse código no IE11 e falhou ? ;)
C69
6
Não reduzi o voto, mas tentei isso na versão mais recente do Chrome e falhei, por isso não é apenas um problema do IE.
Meshaal
3
consulte kangax.github.io/compat-table/es6 para obter um gráfico de suporte mais ou menos atualizado. Atualmente, de todos os navegadores de desktop, apenas o FF e o IE TP (também conhecido como Spartan, também conhecido como MS Non-IE browser) suportam Array.frome...
c69
Parece que o Firefox é o único navegador compatível Array.from. developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…
425nesp
1
Aqui você pode habilitá-lo para o Chrome chrome://flags/#enable-javascript-harmonyLembre-se de que é experimental, não pense por um momento que esta é uma boa solução para o desenvolvimento.
Sospedra
12

Supondo que você esteja apenas usando Settemporariamente para obter valores exclusivos em uma matriz e depois convertendo-os novamente em uma matriz, tente usar o seguinte:

_.uniq([])

Isso depende do uso de sublinhado ou lo-dash .

frenético
fonte
Infelizmente a única solução multi-broser
Marco Sila
6

Talvez seja tarde demais para a festa, mas você pode fazer o seguinte:

const set = new Set(['a', 'b']);
const values = set.values();
const array = Array.from(values);

Isso deve funcionar sem problemas nos navegadores que suportam o ES6 ou se você tiver um calço que polifaça corretamente a funcionalidade acima.

Edit : Hoje você pode apenas usar o que o @ c69 sugere:

const set = new Set(['a', 'b']);
const array = [...set]; // or Array.from(set)
Roland
fonte
1
Parece que usando o set.entries()você obterá uma matriz de pares. Você pode usar set.values()para obter a matriz simples.
Shimon Rachlenko
@ShimonRachlenko true, e o usuário pediu isso.
Roland
2
Você pode simplesmente usarvar array = Array.from(set);
Buffalo
esta resposta está errada. Você não precisa da ligação .entriesnem .values. Como @Buffalo mencionado acima - Array.from(set)é suficiente.
C69
1
@ c69 isso é verdade. No momento desta resposta, Array.from()não funcionava conforme o esperado. Mas agora se espalhe e Array.from()ambos funcionam muito bem.
Roland
4

Use o spread Operator para obter o resultado desejado

var arrayFromSet = [...set];
Vignesh Murugan
fonte
0

No meu caso, a solução foi:

var testSet = new Set();
var testArray = [];

testSet.add("1");
testSet.add("2");
testSet.add("2"); // duplicate item
testSet.add("3");

var someFunction = function (value1, value2, setItself) {
    testArray.push(value1);
};

testSet.forEach(someFunction);

console.log("testArray: " + testArray);

valor1 é igual a valor2 => O valor contido na posição atual no Conjunto. O mesmo valor é passado para ambos os argumentos

Trabalhou sob o IE11.

d0wn
fonte
0

Usar Set e convertê-lo em uma matriz é muito semelhante a copiar uma matriz ...

Portanto, você pode usar os mesmos métodos para copiar uma matriz, o que é muito fácil no ES6

Por exemplo, você pode usar ...

Imagine que você possui este conjunto abaixo:

const a = new Set(["Alireza", "Dezfoolian", "is", "a", "developer"]);

Você pode simplesmente convertê-lo usando:

const b = [...a];

e o resultado é:

["Alireza", "Dezfoolian", "is", "a", "developer"]

Uma matriz e agora você pode usar todos os métodos que você pode usar para uma matriz ...

Outras maneiras comuns de fazer isso:

const b = Array.from(a);

ou usando loops como:

const b = [];
a.forEach(v => b.push(v));
Alireza
fonte
0

O código abaixo cria um conjunto a partir de uma matriz e, em seguida, usando o ...operador

var arr=[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,];
var set=new Set(arr);
let setarr=[...set];
console.log(setarr);
Ekram Mallick
fonte
Por favor, comente seu código.
Hima
1
..e é isso que?
ZF007 31/12/19
-1

Aqui está uma maneira fácil de obter apenas valores brutos exclusivos da matriz. Se você converter a matriz em Conjunto e depois disso, faça a conversão de Conjunto em matriz. Essa conversão funciona apenas para valores brutos, para objetos na matriz não é válida. Tente você mesmo.

    let myObj1 = {
        name: "Dany",
        age: 35,
        address: "str. My street N5"
    }

    let myObj2 = {
        name: "Dany",
        age: 35,
        address: "str. My street N5"
    }

    var myArray = [55, 44, 65, myObj1, 44, myObj2, 15, 25, 65, 30];
    console.log(myArray);

    var mySet = new Set(myArray);
    console.log(mySet);

    console.log(mySet.size === myArray.length);// !! The size differs because Set has only unique items

    let uniqueArray = [...mySet];
    console.log(uniqueArray); 
    // Here you will see your new array have only unique elements with raw 
    // values. The objects are not filtered as unique values by Set.
    // Try it by yourself.
zdrsoft
fonte
-1

RESPOSTA MAIS SIMPLES

apenas espalhe o conjunto por dentro []

let mySet = new Set()
mySet.add(1)
mySet.add(5)
mySet.add(5) 
let arr = [...mySet ]

Resultado : [1,5]

Aljohn Yamaro
fonte