为链表数据结构实现iterator接口
程序员文章站
2024-01-30 11:20:34
iterator作用 为所有的数据结构提供统一的访问方式。 接口对象 接口对象一共有3个方法,next()方法、return()方法、throw()方法。 next() 必填 用于for..of迭代。 该方法返回一个对象{value,done}。 value:元素值,done:状态位,用于指定循环是 ......
iterator作用
为所有的数据结构提供统一的访问方式。
接口对象
接口对象一共有3个方法,next()方法、return()方法、throw()方法。
next() 必填
用于for..of迭代。
该方法返回一个对象{value,done}。 value:元素值,done:状态位,用于指定循环是否结束。
return() 可选
用于break语句,或出错结束循环。
throw() 可选
throw方法主要是配合 generator 函数使用
接口实现
通过内置symbol.iterator属性来实现接口,该接口主要是返回一个对象指针,然后通过调用接口对象的next方法来实现访问下一个元素值。
具备iterator接口的对象
1:数组
2:字符串
3:函数的 arguments 对象
4: set/map 数据结构
5:typedarray
6:nodelist 对象
接口调用
1:手动调用。
2:for..of语句
3:... (扩展运算符)
特点
for...of循环还有一个特点,就是会正确识别 32 位 utf-16 字符
实例代码
class node { constructor(value) { this.value = value; this.next = null; } } class link { /** * 构造函数 */ constructor(value) { this.head = new node(value); } /** * 插入 * @param {any} value * @param {any} item */ insert(value, item) { let node = new node(value); let current = this.find(item); node.next = current.next; current.next = node; } /** * 查询节点 * @param {any} item * @returns {node} */ find(item) { let current = this.head; while (current && current.value != item) { current = current.next; } return current; } /** * iterator接口实现 */ [symbol.iterator]() { let current = null, target = this; return { next() { current = current != null ? current.next : target.head; if (current != null) { return { value: current.value, done: false }; } return { value: undefined, done: true }; }, return() { return { done: true } } } } }
let l = new link(0); l.insert(2, 0); l.insert(5, 2); l.insert(3, 2); // 到2的后面插入一个3 // for..of 方式调用接口 for (let o of l) { console.log(o); } // 扩展运算符调用接口 console.log(...l); // 手动调用。 // 获取接口对象 let iter = l[symbol.iterator](); // 调用next 方法 console.log(iter.next()); console.log(iter.next()); console.log(iter.next());
源码下载:https://pan.baidu.com/s/1sasqhxzic94ae-syyv0cag
我的百度经验:https://jingyan.baidu.com/article/b7001fe1c5a1240e7282dd8b.html
上一篇: Vue2.0 实现单选互斥的方法
下一篇: 原生JS搭建数据双向绑定