Come convertire Set to Array?


469

Set sembra un buon modo per creare array con elementi unici garantiti, ma non espone alcun buon modo per ottenere proprietà, ad eccezione del generatore [Set] .values, che viene chiamato in modo strano mySet.values.next().

Questo sarebbe andato bene, se si potesse chiamare mape funzioni simili sui set. Ma non puoi farlo anche tu.

Ho provato Array.from, ma sembra convertire solo oggetti simili a array (NodeList e TypedArrays?) In array. Un altro tentativo: Object.keysnon funziona per Sets e Set.prototype non ha un metodo statico simile.

Quindi, la domanda: esiste un metodo integrato conveniente per creare un array con i valori di un determinato set? (L'ordine degli elementi non conta davvero).

se tale opzione non esiste, allora forse c'è una bella guida idiomatica per farlo? come, usando for...ofo simili?

Risposte:


850

se tale opzione non esiste, allora forse c'è una bella guida idiomatica per farlo? come, usando per ... di o simili?

In effetti, ci sono diversi modi per convertire un set in un array :

utilizzando Array.from

let array = Array.from(mySet);

Semplicemente spreadingil set in un array

let array = [...mySet];

Alla vecchia maniera, iterando e spingendo verso un nuovo array (i set hanno forEach)

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

In precedenza, utilizzando la sintassi di comprensione dell'array non standard e ora deprecata:

let array = [v for (v of mySet)];

7
Questo non funziona in Safari (8) o Chrome (41). Ma funziona in Firefox (35) però.
425nesp

2
var array = [v for (v of mySet)];non funziona con Chrome 46
Eric,

18
Penso che il modo più elegante sia semplicemente [...mySet].
Wojciech Bednarski

18
@WojciechBednarski l33t non è elegante . Se uno qualsiasi degli esempi è questo, èArray.from(mySet);
Buffalo,

3
Volevo solo aggiungere che [...mySet]ha problemi quando compilato usando Typescript (vedi questo problema ), quindi probabilmente più sicuro da usare Array.from(mySet)se hai intenzione di convertire in Typescript in un prossimo futuro.
Ivan Gozali,

65

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

Si scopre, possiamo usare l' spreadoperatore:

var myArr = [...mySet];

Oppure, in alternativa, utilizzare Array.from:

var myArr = Array.from(mySet);

1
perché un downvote? ci sono problemi con questo approccio? O qualcuno ha provato a eseguire questo codice in IE11 e non è riuscito ? ;)
c69,

6
Non ho votato a fondo, ma l'ho provato nell'ultima versione di Chrome e non ci sono riuscito, quindi non è solo un problema di IE.
Meshaal,

3
fare riferimento a kangax.github.io/compat-table/es6 per un grafico di supporto più o meno aggiornato. Attualmente, di tutti i browser desktop, supporta solo FF e IE TP (aka Spartan, aka MS Non-IE browser) Array.frome...
c69

Sembra che Firefox sia l'unico browser a supportare Array.from. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
425nesp

1
Qui puoi abilitarlo per Chrome chrome://flags/#enable-javascript-harmonyRicorda che è sperimentale non pensare per il momento che questa sia una buona soluzione per lo sviluppo.
sospedra,

12

Supponendo che si stia semplicemente utilizzando Settemporaneamente per ottenere valori univoci in un array e quindi riconvertirlo in un array, provare a utilizzare questo:

_.uniq([])

Questo si basa sull'uso di trattino basso o trattino basso .


Sfortunatamente l'unica soluzione cross-broser
Marco Sulla

6

Forse troppo tardi per la festa, ma potresti semplicemente fare quanto segue:

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

Questo dovrebbe funzionare senza problemi nei browser che supportano ES6 o se si dispone di uno spessore che riempie correttamente la funzionalità sopra.

Modifica : oggi puoi semplicemente usare ciò che suggerisce @ c69:

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

1
Sembra che usando il set.entries()metodo otterrai coppie di coppie. È possibile utilizzare set.values()per ottenere l'array semplice.
Shimon Rachlenko,

@ShimonRachlenko true, e l'utente l'ha chiesto.
Roland,

2
Puoi semplicemente usarevar array = Array.from(set);
Buffalo,

questa risposta è sbagliata. Non è necessaria la chiamata a .entries, né .values. Come @Buffalo menzionato sopra - Array.from(set)è abbastanza.
c69,

1
@ c69 questo è vero. Al momento di questa risposta, Array.from()non ha funzionato come previsto. Ma ora si è diffuso ed Array.from()entrambi funzionano bene.
Roland,

4

Utilizzare l'operatore spread per ottenere il risultato desiderato

var arrayFromSet = [...set];

0

Nel mio caso la soluzione era:

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);

valore1 è uguale a valore2 => Il valore contenuto nella posizione corrente nel set. Lo stesso valore viene passato per entrambi gli argomenti

Ha lavorato con IE11.


0

utilizzando Set e la sua conversione in un array è molto simile alla copia di un array ...

Quindi puoi usare gli stessi metodi per copiare un array in cui è molto semplice ES6

Ad esempio, puoi usare ...

Immagina di avere questo set qui sotto:

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

Puoi semplicemente convertirlo usando:

const b = [...a];

e il risultato è:

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

Un array e ora puoi usare tutti i metodi che puoi usare per un array ...

Altri modi comuni per farlo:

const b = Array.from(a);

o usando loop come:

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

0

Il codice seguente crea un set da un array e quindi, utilizzando l' ...operatore.

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);

Si prega di commentare il codice.
Hima,

1
..e questo è cosa?
ZF007,

-1

Ecco un modo semplice per ottenere solo valori grezzi univoci dall'array. Se converti l'array in Set e successivamente, esegui la conversione da Set in array. Questa conversione funziona solo per valori non elaborati, per gli oggetti nell'array non è valida. Provalo da solo.

    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.

-1

RISPOSTA SEMPLICE

basta diffondere il set all'interno di []

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

Risultato : [1,5]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.