Mal*_*lio 2 iterator generator ecmascript-6 map-function
这似乎完全自然的,我认为发电机,其功能非常像数组,应该支持非常基本的列表操作,如map(),filter()和reduce()。我错过了什么吗?
我为map它编写了代码,看起来很简单,但是将所有函数嵌入所有生成器中会更好:
let fancyGen = g => {
let rv = function*() {
for (let x of g)
yield x;
}
rv.map = function*(p) {
for (let x of g)
yield p(x);
}
return rv;
}
Run Code Online (Sandbox Code Playgroud)
我是生成器的新手,因此欢迎对代码提出任何意见。特别是,这是编写“身份生成器”的最佳方式吗?
为什么生成器不支持 map()?
因为作为用户空间实现填写太容易了。ES3 也不包含数组迭代方法,也许会在 ES7 中看到迭代器的转换器 :-)
生成器,其功能与数组非常相似
不,请停止并区分迭代器和生成器:
.next()符合迭代器协议的方法的对象。function*)创建的迭代器。它的.next()方法接受一个参数,它是每个yield生成器函数内部的结果。它也有.return()和.throw()方法。您将主要对迭代器感兴趣,我们不将值传递给next,也不关心最终结果 - 就像for of循环一样。我们可以轻松地使用所需的方法扩展它们:
var IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));
IteratorPrototype.map = function*(f) {
for (var x of this)
yield f(x);
};
IteratorPrototype.filter = function*(p) {
for (var x of this)
if (p(x))
yield x;
};
IteratorPrototype.scan = function*(f, acc) {
for (var x of this)
yield acc = f(acc, x);
return acc;
};
IteratorPrototype.reduce = function(f, acc) {
for (var x of this)
acc = f(acc, x);
return acc;
};
Run Code Online (Sandbox Code Playgroud)
这些应该足以开始和最常见的用例。一个合适的库会将其扩展到生成器,以便适当地传递值,并且还将处理迭代器在耗尽之前只能使用一次的问题(与数组相反)。
| 归档时间: |
|
| 查看次数: |
460 次 |
| 最近记录: |