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 是惰性求值的,只在需要时才计算下一个值,节省内存。