将 ES5 数组方法与 ES6 生成器一起使用
Using ES5 array methods with ES6 generators
在 ES6 生成器中使用新的 ES5 数组函数的正确方法是什么?我是否必须先将可迭代对象显式转换为数组,还是有更好的方法?例如:
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));
生成器函数 return Iterator objects. The Iterator API does not include higher order Array methods such as map
, reduce
etc, so you need to build an intermediate Array (or use a library like wu.js).
您可以使用 spread operator 从(有限)迭代器简洁地构建数组:
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。
如果您想在不创建数组的情况下执行 reduce,那么您最终需要执行如下操作:
var sum = 0;
for (e of range(0, 10)) sum += e;
由于 Array.from
目前在 Chrome 上不起作用,我需要另一种方法将迭代器转换为数组。
(当然你可以 shim it with a polyfill)
function iterator2Array(iterator) {
var result = [];
for (var item in iterator) {
result.push(item)
}
return result;
}
出于类似的原因,我在 Map 的原型中添加了一个 "toArray",以便我基本上将迭代器转换为数组,以便您可以使用它的面向函数的方法;当然,数组中的每一项都是一个 [key, value] 元组(与其 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()
然后您可以将其用作数组 - 不过请记住 [key, value] 方法!
m.toArray().map(
function(item, index, array) {
var key = item[0],
value = item[1];
console.log(key + ": " + value);
return value;
});
这将 return 地图的值(好的当然不是多余的!)
如果您更喜欢外观更标准的循环:
var i = iterator.entries(),
result = [],
value;
while (value = i.next().value) {
result.push(value);
}
在 ES6 生成器中使用新的 ES5 数组函数的正确方法是什么?我是否必须先将可迭代对象显式转换为数组,还是有更好的方法?例如:
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));
生成器函数 return Iterator objects. The Iterator API does not include higher order Array methods such as map
, reduce
etc, so you need to build an intermediate Array (or use a library like wu.js).
您可以使用 spread operator 从(有限)迭代器简洁地构建数组:
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。
如果您想在不创建数组的情况下执行 reduce,那么您最终需要执行如下操作:
var sum = 0;
for (e of range(0, 10)) sum += e;
由于 Array.from
目前在 Chrome 上不起作用,我需要另一种方法将迭代器转换为数组。
(当然你可以 shim it with a polyfill)
function iterator2Array(iterator) {
var result = [];
for (var item in iterator) {
result.push(item)
}
return result;
}
出于类似的原因,我在 Map 的原型中添加了一个 "toArray",以便我基本上将迭代器转换为数组,以便您可以使用它的面向函数的方法;当然,数组中的每一项都是一个 [key, value] 元组(与其 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()
然后您可以将其用作数组 - 不过请记住 [key, value] 方法!
m.toArray().map(
function(item, index, array) {
var key = item[0],
value = item[1];
console.log(key + ": " + value);
return value;
});
这将 return 地图的值(好的当然不是多余的!)
如果您更喜欢外观更标准的循环:
var i = iterator.entries(),
result = [],
value;
while (value = i.next().value) {
result.push(value);
}