Использование методов массива ES5 с генераторами ES6

Каков правильный способ использования новых функций массива ES5 с генераторами ES6? Должен ли я явно преобразовать итерабельность в массив сначала, или есть лучший способ? Например:

function* range(low, high) { var i = low; while(i < high) yield i++; } // Sum of numbers in range, doesn't work console.log(range(0, 10).reduce((x,y) => x + y)); 

Функции генератора возвращают объекты Iterator . API-интерфейс Iterator не включает методы Array более высокого порядка, такие как map , reduce т. Д., Поэтому вам нужно создать промежуточный массив (или использовать библиотеку, такую ​​как wu.js ).

Вы можете использовать оператор спредов для краткой сборки массива из (конечного) итератора:

 var sum = [...range(0, 10)].reduce((e, i) => e + i) 

Создайте массив, используя Array.from :

 console.log(Array.from(range(0, 10)).reduce((x,y) => x + y)); 

Array.from создает массив из итерабельного. См. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from .

Если вы хотите сделать сокращение без создания массива, то вам придется сделать что-то вроде:

 var sum = 0; for (e of range(0, 10)) sum += e; 

Поскольку Array.from не работает в Chrome в настоящее время, мне нужен другой способ преобразования Iterator в массив.

(Хотя, конечно, вы можете закрепить его полиполком )

 function iterator2Array(iterator) { var result = []; for (var item in iterator) { result.push(item) } return result; } 

По аналогичным причинам я добавляю «toArray» к прототипу Карты, чтобы в основном преобразовать итератор в массив, чтобы вы могли использовать его функционально-ориентированные методы; Конечно, каждый элемент массива будет [ключ, значение] кортежа (точно так же, как в его Map.entries() )

 if (!Map.prototype.toArray) { /** * Transforms a map into an Array of 'tuples' [[key, value], ...] */ Map.prototype.toArray = function () { var result = []; for (var item of this) { result.push(item); } return result; } } var m = new Map([[0, 0], ['a', 'A']]); m.toArray() 

Затем вы можете использовать его как массив – помните, что подход [ключ, значение] хотя!

 m.toArray().map( function(item, index, array) { var key = item[0], value = item[1]; console.log(key + ": " + value); return value; }); 

Это вернет значения карты (нормально, конечно, не суперполезно!)

Если вы предпочитаете более стандартный цикл:

 var i = iterator.entries(), result = [], value; while (value = i.next().value) { result.push(value); } 
  • Сделайте вывод библиотеки веб-пакета совместимым с babel6
  • Разница между назначением метода объекта ES6: a, 'a' и ?
  • Класс экспорта (по умолчанию) в ReactJS
  • Есть ли механизм для цикла x раз в ES6 (ECMAScript 6) без изменяемых переменных?
  • Разница между литералами шаблонов и тегами шаблонов шаблонов?
  • Функция React.createClass против ES6 arrow
  • Какие особенности ECMAScript 6 подразумевают строгий режим?
  • Знак доллара, за которым следует квадратная скобка в строке шаблона
  • Доступ к нулевой безопасности (и условное назначение) в ES6 / 2015
  • Объяснение `let` и scoping scoping для циклов
  • Захват всех цепочечных методов и геттеров с использованием прокси (для ленивого исполнения)
  • Давайте будем гением компьютера.