欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

为链表数据结构实现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 数据结构

5typedarray

6nodelist 对象

 

接口调用

1:手动调用。

2for..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