【发布时间】:2021-09-15 04:01:59
【问题描述】:
在 JavaScript 中传递包含过滤 + 映射逻辑的生成器的推荐方法是什么?
不知何故,JavaScript 生成器缺少诸如 filter 和 map 操作数之类的基本内容,类似于数组,以便能够创建包含该逻辑的生成器,而无需先运行迭代。
我的正面方法是实现应用逻辑的自定义函数:
function * filter(g, cb) {
let a;
do {
a = g.next();
if (!a.done && cb(a.value)) {
yield a.value;
}
} while (!a.done);
return a.value;
}
function * map(g, cb) {
let a;
do {
a = g.next();
if (!a.done) {
yield cb(a.value);
}
} while (!a.done);
return a.value;
}
但这会造成回调地狱。我想简单地链接一个生成器,就像一个常规数组:
// create a filtered & re-mapped generator, without running it:
const gen = myGenerator().filter(a => a > 0).map(b => ({value: b}));
// pass generator into a function that will run it:
processGenerator(gen);
有没有办法扩展生成器以自动访问这些基本功能?
另外,如果有人想强调为什么这些基本的东西不是生成器实现的一部分,那就太棒了!我认为过滤和映射是序列需要的两个最基本的东西。
【问题讨论】:
-
看起来有一个提案github.com/tc39/proposal-iterator-helpers目前在第2阶段
-
还有一些 npm 包的链接,它们可能会实现一些所需的功能
-
@skyboyer 这看起来很有趣。不过我想知道,今天是否有任何 polyfill 可以使用它,而不是几年后 :)
-
这能回答你的问题吗? How to extend the Generator class?
-
以下问题正在处理相同的问题:stackoverflow.com/questions/47534156/…
标签: javascript generator