2014-12-23 5 views
41

Скажите, что у вас есть массив Javascript ES6 Iterable, который вы знаете заранее, будет конечным по длине, что лучший способ преобразовать его в массив Javascript?Преобразование ES6 Итерабельно в массив

Причина в том, что многие библиотеки js, такие как подчеркивание и lodash, поддерживают только массивы, поэтому, если вы хотите использовать любую из своих функций в Iterable, его сначала необходимо преобразовать в массив.

В python вы можете просто использовать функцию list(). Есть ли эквивалент в ES6?

+13

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

ответ

8

Вы можете использовать метод Array.from, который добавляется в ES6, но поддерживает только массивы и итерируемые объекты, такие как Карты и наборы (также входящие в ES6). Для обычных объектов вы можете использовать метод toArray Underscore или метод toArray от lodash, так как обе библиотеки имеют большую поддержку объектов, а не только массивов. Если вы уже используете подчеркивание или lodash, то, к счастью, они могут справиться с этой проблемой, наряду с добавлением различных функциональных концепций, таких как карта и сокращение для ваших объектов.

68

Вы можете использовать Array.from или spread operator.

Пример:

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

Почти то же самое относится к ES6 'let m = new Map()' data-structure: для получения только значений Map, используйте 'Array.from' или оператор spread на' m.values ​​() ', то же самое для' m .keys() '. В противном случае вы получите массив массивов: '[[ключ, значение], [ключ, значение]]'. –

-4

Вы также можете сделать:

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

Или "трудный путь", используя функцию генератора ES5 + (Fiddle работает в текущем 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); 
} 

Оба подхода, конечно же, не рекомендуются и являются просто доказательством концепции.

 Смежные вопросы

  • Нет связанных вопросов^_^