【发布时间】:2019-05-24 12:03:33
【问题描述】:
如何使用返回生成器对象并能够链接它们的函数来扩展 Array?
我已经尝试扩展 Array 以查看是否可以链接生成器函数。第一个调用有效,但下一个链不会,因为它返回一个生成器对象,我不知道如何扩展它。
Array.prototype.select = function* (fn) {
let it = this[Symbol.iterator]();
for (let item of it) yield fn(item);
}
Array.prototype.where = function* (fn) {
let it = this[Symbol.iterator]();
for (let item of it) {
if (fn(item)) yield item;
}
}
我希望能够将这样的生成器链接到数组
let result = arr.select(v => v * 2)
.where(v => v % 3 === 0);
for (let item of result) console.log(item);
【问题讨论】:
-
为什么不使用内置方法?
arr.map(v => v * 2).filter(v => v % 3 === 0) -
扩展原型是一个冒险的提议。见Why is extending native objects a bad practice?。
-
@adiga 我是 javascript 新手,我正在尝试如何实现 LINQ 延迟执行。我只是对生成器感到好奇,因为它让我想起了 C# IEnumerator 接口。
-
@adiga checkout this repl 看看我想要实现什么。
-
@Kierkegaard 我已经完成了exactly this。它是用 TypeScript 编写的,但你可以在 node 中使用它,只使用 JavaScript,因为它是预编译的。我确实计划很快将其更新为 umd 格式。
标签: javascript generator chain