Converti ES6 Iterable in Array

Supponiamo che tu abbia un Javascript ES6 Iterable simile a una serie che sai in anticipo sarà di lunghezza finita, qual è il modo migliore per convertirlo in un array Javascript?

La ragione per farlo è che molte librerie js come underscore e lodash supportano solo gli array, quindi se si desidera utilizzare una delle loro funzioni su un Iterable, deve prima essere convertito in una matrice.

In Python puoi semplicemente usare la funzione list (). Esiste un equivalente in ES6?

Puoi utilizzare Array.from o l’ operatore di spread .

Esempio:

 let x = new Set([ 1, 2, 3, 4 ]); let y = Array.from(x); console.log(y); // = [ 1, 2, 3, 4 ] let z = [ ...x ]; console.log(z); // = [ 1, 2, 3, 4 ] 

È ansible utilizzare il metodo Array.from , che viene aggiunto in ES6, ma supporta solo array e oggetti iterabili come Maps e Sets (anch’essi in ES6). Per gli oggetti normali, è ansible utilizzare il metodo Underscore’s toArray o il metodo lodash toArray, poiché entrambe le librerie hanno un grande supporto per gli oggetti, non solo per gli array. Se stai già usando il trattino basso o il lodash, per fortuna possono gestire il problema per te, oltre ad aggiungere vari concetti funzionali come la mappa e ridurre per i tuoi oggetti.

Sommario:

  • Array.from() , richiede un iterabile come in input e restituisce un array del iterabile.
  • Operatore di spread: ... in combinazione con un array letterale.
 const map = new Map([[ 1, 'one' ],[ 2, 'two' ]]); const newArr1 = [ ...map ]; // create an Array literal and use the spread syntax on it const newArr2 = Array.from( map ); // console.log(newArr1, newArr2); 

Potresti anche fare:

 let arr = []; for (let elem of gen(...)){ arr.push(elem); } 

O “il modo più duro” usando la funzione di generatore ES5 + ( Fiddle funziona con Firefox corrente):

 var squares = function*(n){ for (var i=0; i 

Entrambi gli approcci non sono certamente raccomandabili e sono semplicemente una dimostrazione di concetto.