当前位置: 移动技术网 > IT编程>开发语言>JavaScript > 为链表数据结构实现iterator接口

为链表数据结构实现iterator接口

2019年01月22日  | 移动技术网IT编程  | 我要评论

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

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网