¿Cómo convertir Set a Array?

469

Set parece ser una buena manera de crear matrices con elementos únicos garantizados, pero no expone ninguna buena manera de obtener propiedades, excepto los valores [Set]. Generador, que se llaman de una manera incómoda mySet.values.next().

Esto hubiera estado bien, si pudieras llamar mapy funciones similares en Sets. Pero tampoco puedes hacer eso.

Lo he intentado Array.from, pero parece estar convirtiendo solo objetos tipo matriz (¿NodeList y TypedArrays?) En Array. Otro intento: Object.keysno funciona para Sets, y Set.prototype no tiene un método estático similar.

Entonces, la pregunta: ¿hay algún método incorporado conveniente para crear una matriz con valores de un conjunto dado? (El orden del elemento realmente no importa).

Si no existe tal opción, entonces ¿tal vez hay una buena frase idiomática para hacer eso? como, usando for...of, o similar?

c69
fuente

Respuestas:

851

Si no existe tal opción, entonces ¿tal vez hay una buena frase idiomática para hacer eso? como, usando para ... de, o similar?

De hecho, hay varias formas de convertir un conjunto en una matriz :

utilizando Array.from

let array = Array.from(mySet);

Simplemente spreadingel conjunto en una matriz

let array = [...mySet];

La forma antigua, iterando y empujando a una nueva matriz (los conjuntos tienen forEach)

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

Anteriormente, utilizando la sintaxis de comprensión de matriz no estándar y ahora obsoleta:

let array = [v for (v of mySet)];
adeneo
fuente
77
Esto no funciona en Safari (8) o Chrome (41). Pero sí funciona en Firefox (35).
425nesp
2
var array = [v for (v of mySet)];no funciona en Chrome 46
Eric
18
Creo que la forma más elegante es simplemente [...mySet].
Wojciech Bednarski
18
@WojciechBednarski l33t no es elegante . Si alguno de los ejemplos es ese, esArray.from(mySet);
Buffalo
3
Solo quería agregar que [...mySet]tiene problemas cuando se compila utilizando Typecript (vea este problema ), por lo que probablemente sea más seguro usarlo Array.from(mySet)si tiene la intención de convertir a Typecript en el futuro cercano.
Ivan Gozali
65

a través de https://speakerdeck.com/anguscroll/es6-uncensored por Angus Croll

Resulta que podemos usar el spreadoperador:

var myArr = [...mySet];

O, alternativamente, use Array.from:

var myArr = Array.from(mySet);
c69
fuente
1
¿Por qué un voto negativo? ¿Hay algún problema con este enfoque? ¿O alguien intentó ejecutar este código en IE11 y falló ? ;)
c69
66
No voté en contra, pero probé esto en la última versión de Chrome y fallé, por lo que no es solo un problema de IE.
Meshaal
3
consulte kangax.github.io/compat-table/es6 para obtener un cuadro de soporte más o menos actualizado. Actualmente, de todos los navegadores de escritorio, solo admite FF e IE TP (también conocido como Spartan, también conocido como MS Non-IE browser) Array.fromy...
c69
Parece que Firefox es el único navegador que admite Array.from. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
425nesp
1
Aquí puede habilitarlo para Chrome. chrome://flags/#enable-javascript-harmonyRecuerde que es experimental. No piense por el momento que es una buena solución para el desarrollo.
sospedra
12

Suponiendo que solo esté usando Settemporalmente para obtener valores únicos en una matriz y luego convirtiendo nuevamente a una matriz, intente usar esto:

_.uniq([])

Esto se basa en el uso de guión bajo o lo-dash .

fremn
fuente
Desafortunadamente, la única solución cross-broser
Marco Sulla
6

Quizás llegar tarde a la fiesta, pero podrías hacer lo siguiente:

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

Esto debería funcionar sin problemas en los navegadores que tienen soporte para ES6 o si tiene una cuña que rellena correctamente la funcionalidad anterior.

Editar : hoy puede usar lo que @ c69 sugiere:

const set = new Set(['a', 'b']);
const array = [...set]; // or Array.from(set)
Roland
fuente
1
Parece que usando el set.entries()obtendrá una matriz de pares. Puede usar set.values()para obtener la matriz simple.
Shimon Rachlenko
@ShimonRachlenko cierto, y el usuario solicitó eso.
Roland
2
Simplemente puede usarvar array = Array.from(set);
Buffalo
Esta respuesta es simplemente incorrecta. No necesita la llamada a .entries, ni .values. Como @Buffalo mencionó anteriormente, Array.from(set)es suficiente.
c69
1
@ c69 eso es cierto. En el momento de esta respuesta, Array.from()no funcionó como se esperaba. Pero ahora se extendió y Array.from()ambos funcionan bien.
Roland
4

Use el Operador de propagación para obtener el resultado deseado

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

Usar Set y convertirlo en una matriz es muy similar a copiar una matriz ...

Por lo tanto, puede usar los mismos métodos para copiar una matriz que es muy fácil en ES6

Por ejemplo, puedes usar ...

Imagina que tienes este conjunto a continuación:

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

Simplemente puede convertirlo usando:

const b = [...a];

y el resultado es:

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

Una matriz y ahora puede usar todos los métodos que puede usar para una matriz ...

Otras formas comunes de hacerlo:

const b = Array.from(a);

o usando bucles como:

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

El siguiente código crea un conjunto a partir de una matriz y luego, utilizando el ...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
fuente
Por favor comente su código.
Hima
1
..y esto es lo que?
ZF007
-1

Aquí hay una manera fácil de obtener solo valores brutos únicos de la matriz. Si convierte el conjunto a Conjunto y después de esto, realice la conversión de Conjunto a conjunto. Esta conversión funciona solo para valores sin formato, para objetos en la matriz no es válida. Pruébalo tú mismo.

    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
fuente
-1

RESPUESTA MÁS SENCILLA

solo esparce el set dentro []

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

Resultado : [1,5]

Aljohn Yamaro
fuente