zoukankan      html  css  js  c++  java
  • javascript自定义一个迭代器

    js中对象分为可迭代和不可迭代 如果是可迭代哪它就会有一个[Symbol.iterator] 函数

    这个函数就是对象的迭代器函数,如用for of 如果遍历的对象没有这个迭代方法那么就会报错

    for of 传入的是可迭代对象,但是如何吧一个不可迭代的对象变为可迭代的对象呢!

    很简单就是自己写一个[Symbol.iterator] 函数。

    代码如下:

      

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    
    <body>
        <script>
            let obj = {
                a: 1,
                b: 2
            }
    
            obj[Symbol.iterator] = function () {
                //取到对象的每个key值返回一个数组
                let keys = Object.keys(obj);
                //取到key值的长度
                let len = keys.length;
                //定义循环变量
                let n = 0;
                //返回对象 每次迭代会自动调用对象里面的next方法
                return {
                    next() {
                        //返回值有value和done
                        //value能自定义
                        //done为true跳出循环
                        return n < len ? {
                            value: { k: keys[n], v: obj[keys[n++]] },
                            done: false
                        } : {
                                done: true
                            }
                    }
                }
            }
            //循环 
            //for of 只能遍历可迭代对象
            //所以自己写了个迭代器 详情请查阅web迭代协议
            //返回的是个对象的key和value
            for (let { k, v } of obj) {
                console.log(k, v);
            }
        </script>
    </body>
    
    </html>

     使用生成器迭代也就是Generator函数代码如下:

    let obj = {
                a: 1,
                b: 2
            }
            obj[Symbol.iterator] = function *(){
               let keys = Object.keys(obj);
               //取到key值的长度
               let len = keys.length;
               //定义循环变量
                let n = 0;
                //条件判断
                while(n < len) {
                    yield {k:keys[n],v: obj[keys[n++]]};
                }
            }
        //返回的是个对象的key和value
            for (let {k,v} of obj) {
                console.log(k,v);
            }

    注释很完整就不多讲了,

    2次输出结果相同

    输出如下:

      

      希望能够帮助到你们!!

      

  • 相关阅读:
    【题解】小Z的袜子
    浅谈最小生成树
    【题解】钻石收藏家
    浅谈线段树
    浅谈拓扑排序
    浅谈树的直径和树的重心
    浅谈求逆序对
    浅谈欧拉回路
    浅谈离散化
    浅谈高斯消元
  • 原文地址:https://www.cnblogs.com/y-y-y-y/p/10535800.html
Copyright © 2011-2022 走看看