分块迭代器通过symbol.iterator实现按需分段遍历:封装数组与chunksize,next()中用slice切片并更新索引,返回{value:子数组,done:布尔值};支持for...of,异步场景应实现symbol.asynciterator。

原始数据集本身不可迭代,必须先包装成可迭代对象,再通过 Symbol.iterator 定制分段逻辑——核心是控制每次调用 next() 时返回哪一段数据,而非一次性展开全部。
让任意数组支持“按块迭代”
直接在数组原型上扩展不推荐,更安全的做法是封装一个可迭代的分块包装器。它接收原始数组和每段大小(chunkSize),内部维护索引位置,在每次 next() 中切出下一块:
- 初始化时保存数组引用与起始下标(如
0) -
next()方法计算当前段的start和end,用slice()提取子数组 - 更新下标,若超出原数组长度则返回
{ done: true } - 返回结构为
{ value: 当前块数组, done: 布尔值 }
用 for...of 消费分段结果
只要对象实现了 [Symbol.iterator] 方法并返回符合迭代器协议的对象,就能直接用于 for...of。例如:
for (const chunk of chunked) {
console.log(chunk); // [1,2] → [3,4] → [5,6]
}
支持异步分段或流式处理场景
若原始数据来自 API 或文件流,可在 next() 中返回 Promise,配合 for await...of 使用。此时迭代器需返回 { value: Promise, done: boolean },注意协议要求的是同步迭代器;如需真正异步迭代,应实现 [Symbol.asyncIterator] 而非混用。
避免常见陷阱
- 不要在
next()中修改原始数据源,否则影响后续分段一致性 - 确保
done: true后再次调用next()仍返回{ value: undefined, done: true } - 若需重用该迭代器(如多次遍历),应设计为返回新迭代器实例,而非复用同一状态对象










