Skip to content

iterate

创建一个迭代器,用于遍历数组元素。

基础用法

typescript
import { iterate } from 'radash'

const numbers = [1, 2, 3, 4, 5]
const iterator = iterate(numbers)

let result = iterator.next()
while (!result.done) {
  console.log(result.value) // 1, 2, 3, 4, 5
  result = iterator.next()
}

语法

typescript
function iterate<T>(
  array: readonly T[]
): Iterator<T>

参数

  • array (readonly T[]): 要迭代的数组

返回值

返回一个标准的JavaScript迭代器对象,包含 next() 方法。

示例

基本迭代

typescript
import { iterate } from 'radash'

const fruits = ['apple', 'banana', 'cherry']
const iterator = iterate(fruits)

console.log(iterator.next()) // { value: 'apple', done: false }
console.log(iterator.next()) // { value: 'banana', done: false }
console.log(iterator.next()) // { value: 'cherry', done: false }
console.log(iterator.next()) // { value: undefined, done: true }

使用for...of循环

typescript
import { iterate } from 'radash'

const numbers = [1, 2, 3, 4, 5]
const iterator = iterate(numbers)

for (const num of iterator) {
  console.log(num) // 1, 2, 3, 4, 5
}

手动控制迭代

typescript
import { iterate } from 'radash'

const users = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' },
  { id: 3, name: 'Charlie' }
]

const iterator = iterate(users)

// 获取第一个元素
const first = iterator.next()
console.log(first.value) // { id: 1, name: 'Alice' }

// 跳过第二个元素
iterator.next()

// 获取第三个元素
const third = iterator.next()
console.log(third.value) // { id: 3, name: 'Charlie' }

条件迭代

typescript
import { iterate } from 'radash'

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
const iterator = iterate(numbers)

let result = iterator.next()
while (!result.done && result.value <= 5) {
  console.log(result.value) // 1, 2, 3, 4, 5
  result = iterator.next()
}

与生成器函数结合

typescript
import { iterate } from 'radash'

function* filterEven(iterator: Iterator<number>) {
  let result = iterator.next()
  while (!result.done) {
    if (result.value % 2 === 0) {
      yield result.value
    }
    result = iterator.next()
  }
}

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
const iterator = iterate(numbers)

for (const even of filterEven(iterator)) {
  console.log(even) // 2, 4, 6, 8, 10
}

处理空数组

typescript
import { iterate } from 'radash'

const emptyArray: number[] = []
const iterator = iterate(emptyArray)

const result = iterator.next()
console.log(result) // { value: undefined, done: true }

注意事项

  1. 迭代器状态: 迭代器会记住当前位置,每次调用 next() 都会前进到下一个元素
  2. 一次性使用: 迭代器只能向前遍历,不能重置或向后遍历
  3. 空数组处理: 如果数组为空,第一次调用 next() 就返回 { done: true }
  4. 性能: 时间复杂度为 O(1) 每次调用,总体为 O(n)

与其他方法的区别

  • for...of: 直接遍历数组,语法更简洁
  • iterate(): 返回迭代器对象,提供更细粒度的控制
  • forEach(): 立即执行所有元素,无法中途停止
  • map(): 返回新数组,而不是迭代器

实际应用场景

  1. 流式处理: 处理大量数据时,逐个处理元素
  2. 条件遍历: 根据条件决定是否继续遍历
  3. 内存优化: 避免一次性加载所有数据到内存
  4. 自定义迭代: 实现自定义的迭代逻辑
  5. 异步处理: 在异步环境中逐个处理元素

Released under the MIT License.