构建可双向迭代的自定义可迭代对象
超越简单的 for...of,实现一个二叉树数据结构同时支持正向(中序)和反向(逆中序)迭代,使用 Symbol.iterator 和 Symbol.asyncIterator。 · 难度:入门 · +10XP
构建可双向迭代的自定义可迭代对象
JavaScript 的迭代器协议只定义了 next(),但我们可以通过返回不同的迭代器对象来实现双向遍历。本教程将实现一个二叉搜索树,内部维护节点数组,并提供两个方法:createForwardIterator 和 createReverseIterator,分别用 Symbol.iterator 和单独的 reverse 属性暴露。甚至可以用生成器函数简化实现,并支持 break 退出。
class Tree { constructor() { this.nodes = []; } add(value) { /* 插入排序 */ } [Symbol.iterator]() { let index = 0; return { next: () => ({ value: this.nodes[index++], done: index > this.nodes.length }) }; } reverse() { let index = this.nodes.length - 1; return { [Symbol.iterator]: () => ({ next: () => ({ value: this.nodes[index--], done: index < -1 }) }) }; } }
const tree = new Tree(); tree.add(3); tree.add(1); tree.add(2); console.log([...tree]); // 1,2,3 console.log([...tree.reverse()]); // 3,2,1