基于条件创建一个JavaScript生成器函数
几乎每个生成器函数都需要一个终止条件。我们可以轻松地创建一个生成器函数,它接受一个谓词函数作为参数,并在条件满足的情况下不断产生新的值,而不是一遍又一遍地编写相同的代码。
给定一个条件,我们可以使用提供的seed
值来初始化当前值。然后,使用while
循环,只要用当前的val
调用谓词函数返回true
,就可以进行迭代。
在循环内部,我们可以使用yield
来返回当前的val
,并可选择接收一个新的种子值nextSeed
。最后,我们可以使用next
函数来从当前的val
和nextSeed
计算出下一个值。
const generateWhile = function* (seed, predicate, next) {
let val = seed;
let nextSeed = null;
while (predicate(val)) {
nextSeed = yield val;
val = next(val, nextSeed);
}
return val;
};
[...generateWhile(1, v => v <= 5, v => ++v)]; // [1, 2, 3, 4, 5]
[!TIP]
你可以通过将
while
循环的条件改为!predicate(val)
,将此代码切换为满足条件时停止的工作方式。