Skip to content

generatorUtils ​

Generator 工具函数集合,提供 take、filter、map 等操作符。

函数签名 ​

typescript
function* take<T>(generator: Generator<T>, n: number): Generator<T>
function* filter<T>(generator: Generator<T>, predicate: (value: T) => boolean): Generator<T>
function* map<T, U>(generator: Generator<T>, fn: (value: T) => U): Generator<U>
function toArray<T>(generator: Generator<T>): T[]

参数 ​

take ​

参数名类型必填说明
generatorGenerator<T>是源 Generator
nnumber是要获取的元素数量

filter ​

参数名类型必填说明
generatorGenerator<T>是源 Generator
predicate(value: T) => boolean是过滤函数

map ​

参数名类型必填说明
generatorGenerator<T>是源 Generator
fn(value: T) => U是映射函数

toArray ​

参数名类型必填说明
generatorGenerator<T>是源 Generator

返回值 ​

函数类型说明
takeGenerator<T>返回前 n 个元素的 Generator
filterGenerator<T>返回过滤后的 Generator
mapGenerator<U>返回映射后的 Generator
toArrayT[]将 Generator 转换为数组

工作原理 ​

take ​

  1. 遍历源 Generator
  2. yield 前 n 个元素
  3. 到达 n 个后停止

filter ​

  1. 遍历源 Generator 的每个值
  2. 对每个值调用 predicate 函数
  3. 如果返回 true,yield 该值
  4. 否则跳过

map ​

  1. 遍历源 Generator 的每个值
  2. 对每个值调用 fn 函数
  3. yield 映射后的结果

toArray ​

  1. 遍历 Generator 的所有值
  2. 收集到数组中
  3. 返回数组

示例:

typescript
function* numbers() {
  let i = 0
  while (true) yield i++
}

const result = toArray(
  take(
    filter(
      map(numbers(), (n) => n * 2),
      (n) => n % 3 === 0
    ),
    5
  )
)
// [0, 6, 12, 18, 24]

Generator 是惰性求值的,只在需要时才计算下一个值,节省内存。