Использование методов массива 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));
- Как запустить приложение Node.js с включенными функциями ES6?
- Самый чистый способ обработки пользовательских ошибок с помощью fetch и ES6
- One-liner для получения некоторых свойств объекта в ES 6
- Что означает несколько функций стрелок в javascript?
- Что такое «функция *» в JavaScript?
- Каковы различия (если есть) между функциями стрелок ES6 и функциями, связанными с Function.prototype.bind?
- Object.is vs ===
- Классы ES6 не работают на Chrome 47
- Babelify выбрасывает ParseError при импорте модуля из node_modules
- Что такое генераторы ES6 и как их использовать в node.js?
- SyntaxError: Неожиданный импорт токена
- ES6 - объявить прототип метода для класса с оператором импорта
- Функция стрелок против объявления / выражений функции: эквивалентны ли они / заменяемы?
Функции генератора возвращают объекты 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); }