基于条件创建一个JavaScript生成器函数

几乎每个生成器函数都需要一个终止条件。我们可以轻松地创建一个生成器函数,它接受一个谓词函数作为参数,并在条件满足的情况下不断产生新的值,而不是一遍又一遍地编写相同的代码。

给定一个条件,我们可以使用提供的seed值来初始化当前值。然后,使用while循环,只要用当前的val调用谓词函数返回true,就可以进行迭代。

在循环内部,我们可以使用yield来返回当前的val,并可选择接收一个新的种子值nextSeed。最后,我们可以使用next函数来从当前的valnextSeed计算出下一个值。

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),将此代码切换为满足条件时停止的工作方式。