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
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
generator | Generator<T> | 是 | 源 Generator |
n | number | 是 | 要获取的元素数量 |
filter
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
generator | Generator<T> | 是 | 源 Generator |
predicate | (value: T) => boolean | 是 | 过滤函数 |
map
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
generator | Generator<T> | 是 | 源 Generator |
fn | (value: T) => U | 是 | 映射函数 |
toArray
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
generator | Generator<T> | 是 | 源 Generator |
返回值
| 函数 | 类型 | 说明 |
|---|---|---|
take | Generator<T> | 返回前 n 个元素的 Generator |
filter | Generator<T> | 返回过滤后的 Generator |
map | Generator<U> | 返回映射后的 Generator |
toArray | T[] | 将 Generator 转换为数组 |
工作原理
take
- 遍历源 Generator
- yield 前 n 个元素
- 到达 n 个后停止
filter
- 遍历源 Generator 的每个值
- 对每个值调用
predicate函数 - 如果返回 true,yield 该值
- 否则跳过
map
- 遍历源 Generator 的每个值
- 对每个值调用
fn函数 - yield 映射后的结果
toArray
- 遍历 Generator 的所有值
- 收集到数组中
- 返回数组
示例:
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 是惰性求值的,只在需要时才计算下一个值,节省内存。