JavaScript实现自定义数据结构过滤迭代的核心是让类实现可迭代协议,即定义[Symbol.iterator]()方法返回符合迭代器协议的对象,其next()方法封装过滤逻辑,支持惰性求值、链式组合与状态管理。

JavaScript 中实现自定义数据结构的过滤迭代,核心是让该结构具备 可迭代协议(iterable protocol),并返回一个符合 迭代器协议(iterator protocol) 的对象;而“过滤”逻辑就封装在这个迭代器的 next() 方法中。
让类支持 for...of 和扩展运算符
只需在类上定义 [Symbol.iterator]() 方法,返回一个迭代器对象(即带 next() 方法的对象)。这个方法可以按需生成值,天然适合实现过滤 —— 遍历时跳过不满足条件的项。
例如,给一个简单的容器类添加“只遍历偶数”的能力:
class NumberList {
constructor(numbers) {
this.numbers = numbers;
}
<p>*[Symbol.iterator]() {
for (const num of this.numbers) {
if (num % 2 === 0) {
yield num;
}
}
}
}</p><p>const list = new NumberList([1, 2, 3, 4, 5, 6]);
for (const n of list) console.log(n); // 输出:2、4、6
console.log([...list]); // [2, 4, 6]</p>手动实现 next() 实现更灵活的过滤控制
如果需要延迟计算、状态管理或复用同一迭代器多次,建议手动返回一个对象而非使用生成器函数。这样能精确控制何时推进、如何判断结束、以及是否支持多次调用 next()。
立即学习“Java免费学习笔记(深入)”;
关键点:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 迭代器对象必须有
next()方法,返回{ value, done } - 内部维护索引或游标,每次调用
next()时跳过不符合条件的元素 - 避免提前把所有过滤结果缓存到数组里,保持惰性求值特性
class FilteredIterator {
constructor(array, predicate) {
this.array = array;
this.predicate = predicate;
this.index = 0;
}
<p>next() {
while (this.index < this.array.length) {
const item = this.array[this.index++];
if (this.predicate(item)) {
return { value: item, done: false };
}
}
return { value: undefined, done: true };
}
}</p><p>class DataCollection {
constructor(items) {
this.items = items;
}</p><p>[Symbol.iterator]() {
return new FilteredIterator(this.items, x => typeof x === 'string' && x.length > 3);
}
}</p><p>const coll = new DataCollection(['a', 'hi', 'hello', 'ok', 'world']);
for (const s of coll) console.log(s); // 'hello', 'world'</p>支持链式过滤与组合
可以把过滤逻辑拆解为多个可复用的迭代器包装器,类似 Array.prototype.filter 的语义,但作用于任意可迭代对象。
例如写一个通用的 filter 迭代器工厂:
function* filter(iterable, predicate) {
for (const item of iterable) {
if (predicate(item)) yield item;
}
}
<p>// 使用示例
const nums = [1, 2, 3, 4, 5];
const evens = filter(nums, x => x % 2 === 0);
const bigEvens = filter(evens, x => x > 2);</p><p>console.log([...bigEvens]); // [4]</p>这种写法既保持了惰性,又便于组合多个条件,且不依赖具体数据结构 —— 只要参数是可迭代的即可。
注意边界与兼容性细节
实际使用中需留意几点:
- 生成器函数(
function*)自动满足迭代器协议,推荐优先使用,简洁安全 - 手动实现
next()时,务必确保done: true后仍返回{ value: undefined, done: true },否则某些环境可能出错 - 若希望迭代器可重用(如多次
for...of),不能共享内部状态;可每次调用[Symbol.iterator]都新建一个迭代器实例 - ES2022 起支持
Iterator.prototype.map、filter等方法(需显式导入或 polyfill),但原生支持有限,生产环境建议自行封装或使用库如itertools

















