2014-12-23 21 views
41

Powiedz, że masz tablicę ES6 ES6 Iterable, o której wiesz, że z góry będzie skończona, jaki jest najlepszy sposób na konwersję do tablicy Javascript?Konwertuj ES6 Iterable to Array

Powodem jest to, że wiele bibliotek js, takich jak podkreślenia i lodash, obsługuje tylko tablice, więc jeśli chcesz używać ich funkcji na Iterable, najpierw musisz je przekonwertować na tablicę.

W pytonie możesz po prostu użyć funkcji list(). Czy istnieje odpowiednik w ES6?

+13

'Array.from (iterable)', patrz [* ECMA-262 ed 6 draft *] (https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from). – RobG

Odpowiedz

8

Można użyć metody Array.from, która jest dodawana w ES6, ale obsługuje tylko tablice i obiekty iterowalne, takie jak Mapy i zestawy (również w formacie ES6). W przypadku zwykłych obiektów można użyć metody Underscore: toArray lub metody toArray metody Lodash, ponieważ obie biblioteki faktycznie obsługują obiekty, a nie tylko tablice. Jeśli już używasz podkreślenia lub lodash, to na szczęście mogą poradzić sobie z problemem, dodając różne koncepcje funkcjonalne, takie jak odwzorowanie i zredukowanie obiektów.

68

Można użyć Array.from lub spread operator.

Przykład:

let s = new Set(); 
s.add(1); 
s.add(2); 
s.add(3); 
s.add(4); 

let a = Array.from(s); // = [ 1, 2, 3, 4 ] 

let b = [...s];  // = [ 1, 2, 3, 4 ] 
+2

Niemal to samo dotyczy ES6 'let m = new Map()' data-structure: aby uzyskać prawidłowe wartości mapy, użyj 'Array.from' lub roześlij operatora na' m.values ​​() ', to samo dla' m .keys() '. W przeciwnym razie otrzymasz tablicę tablic: '[[klucz, wartość], [klucz, wartość]]'. –

-4

Można również zrobić:

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

lub "hard way" używając ES5 + funkcja generatora (Fiddle pracuje w bieżącym Firefox):

var squares = function*(n){ 
    for (var i=0; i<n; i++){ 
     yield i*i; 
    } 
} 

var arr = []; 
var gen = squares(10); 
var g; 
while(true){ 
    g = gen.next(); 
    if (g.done){ 
     break; 
    } 
    arr.push(g.value); 
} 

Oba podejścia są z pewnością nie godne polecenia i są jedynie dowodem koncepcji.