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


    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

  • 相关阅读:
    强大的vim配置,让编程更随意
    如何给ActiveX控件制作有效数字签名
    自动生成MAKEFILE
    .so file not recongnized和不能打开动态库
    验证IP地址格式是否正确的js函数
    innerHTML中onclick()无法执行的解决
    Django教程
    第一节:简单的请求(Requests)和响应(Responses)
    Vmware vsphere webservice sdk 连接打开慢的问题
    Delphi 简单的软件注册Demo
  • 原文地址:https://www.cnblogs.com/whnba/p/10298016.html
Copyright © 2020-2023  润新知