首页 > 其他分享 >行为型:迭代器模式

行为型:迭代器模式

时间:2023-04-11 22:37:29浏览次数:33  
标签:遍历 迭代 生成器 模式 next done let 行为

定义

  迭代器模式提供一种方法按顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器模式是目的性极强的模式它主要是用来解决遍历问题。

es6 中的迭代器

  JS原生的集合类型数据结构,有Array(数组)和Object(对象),在ES6中,又新增了Map和Set。四种数据结构各自有着自己的内部实现,但对于使用者,我们希望以同样的一套规则去遍历它们,所以ES6在推出新数据结构的同时也推出了一套统一的接口机制——迭代器(Iterator)

  es6 中统一了迭代器迭代接口,任何数据结构只要具备Symbol.iterator属性(这个属性就是Iterator的具体实现,它本质上是当前数据结构默认的迭代器生成函数),就可以被遍历,确切的说是被for...of...循环和迭代器的next方法遍历,for...of...的背后正是对next方法的反复调用。

  在ES6中,针对Array、Map、Set、String、TypedArray、函数的 arguments 对象、NodeList 对象这些原生的数据结构都可以通过for...of...进行遍历。

模拟实现迭代器

  迭代就是不断的去拿下一个值的一个过程,以及遍历完的状态,是否完成遍历。

闭包写法

// 定义生成器函数,入参是任意集合
function iteratorGenerator(list) {
    // idx记录当前访问的索引
    let idx = 0
    // len记录传入集合的长度
    let len = list.length
    return {
        // 自定义next方法
        next: function() {
            // 如果索引还没有超出集合长度,done为false
            let done = idx >= len
            // 如果done为false,则可以继续取值
            let value = !done ? list[idx++] : undefined
            
            // 将当前值与遍历是否完毕(done)返回
            return {
                done: done,
                value: value
            }
        }
    }
}

let iterator = iteratorGenerator(['1号选手', '2号选手', '3号选手'])
iterator.next()
iterator.next()
iterator.next()

generator 写法

在es6 中生成器函数 function * xxx 可以返回生成器对象( Generator 对象由生成器函数返回并且它符合可迭代协议迭代器协议。)

生成器函数在执行时能暂停,后面又能从暂停处继续执行。

// 生成器函数写法
function* iteratorGenerator1(list) {
    yield '生成器函数,我是1号'
    yield '生成器函数,我是2号'
    yield '生成器函数,我是3号'
}

let iterator1 = iteratorGenerator1()
console.log(iterator1.next())
console.log(iterator1.next())
console.log(iterator1.next())

// 生成器函数写法--优化
function* iteratorGenerator2(list) {
    let index = 0, len = list.length;
    while (index <= len - 1) {
        
        yield list[index]
        index++
    }
   
}

let iterator2 = iteratorGenerator2(['生成器函数优化,我是1号', '生成器函数优化,我是2号', '生成器函数优化,我说3号'])
console.log(iterator2.next())
console.log(iterator2.next())
console.log(iterator2.next())

小结

可迭代协议:具备Symbol.iterator

迭代器协议:一个类似这个结构的对象:

{
	next: function () {
 	 return {
   		value: 'xx', // 当前遍历节点的值
   		done: false  // 是否完成遍历
    }
  }
}

参考迭代协议

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/function*

 

标签:遍历,迭代,生成器,模式,next,done,let,行为
From: https://www.cnblogs.com/longbensong/p/17308094.html

相关文章

  • openEuler 单机部署 Hadoop SingleNode 模式
    openEuler单机部署HadoopSingleNode模式升级操作系统和软件yum-yupdate升级后建议重启安装常用软件yum-yinstallgccgcc-c++autoconfautomakecmakemakersyncopenssh-servervimmanzipunzipnet-toolszlibzlib-developensslopenssl-develpcre-devel......
  • 六、WPF 动态设置菜单,非MVVM模式
     随手建了WPF窗口<Windowx:Class="WpfAppTest.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://sch......
  • 手搓观察者模式
    用专业的话来说,是这样的:观察者模式定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。用我自己的话说是这样的:法外狂徒张三欠了一屁股债,追债人不知道张三什么时候有钱还。但是张三是个很守信用的人,他一有了钱就会去通知追债人......
  • ip link add bond0 type bond 几种模式
    在使用命令iplinkaddbond0typebond创建Bond接口时,可以指定不同的Bond模式。常见的Bond模式有以下几种:mode=balance-rr:即Round-robin模式,是默认的Bond模式。在该模式下,数据包会按照轮流分发到不同的物理接口上,从而实现负载均衡。mode=active-backup:即Active......
  • spring事务传播行为
      ......
  • 重学Java设计模式-行为型模式-责任链模式
    重学Java设计模式-行为型模式-责任链模式内容摘自:https://bugstack.cn/md/develop/design-pattern/2020-06-18-重学Java设计模式《实战责任链模式》.html#重学-java-设计模式-实战责任链模式「模拟618电商大促期间-项目上线流程多级负责人审批场景」责任链模式介绍图片来自......
  • Java中常用算法及示例-分治、迭代、递归、递推、动态规划、回溯、穷举、贪心
    场景1、分治算法的基本思想是将一个计算复杂的问题分成规模较小、计算简单的小问题求解,然后综合各个小问题,得到最终答案。2、穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。3、迭代法(IterativeMethod)无法使用公式一次求解,而需要使用重复结构(即循环)......
  • .NET Core MongoDB数据仓储和工作单元模式实操
    前言MongoDB从入门到实战的相关教程YyFlight.ToDoList项目源码地址MongoDB事务使用前提说明创建EntityBase公共类添加UserInfo用户表实体映射模型创建用户Repository创建用户管理业务代码UserOperationExample控制创建注册数据库基础操作和工作单元注册相关应用服务......
  • 观察者模式重启线程
    观察者模式重启线程看代码的过程中发现了观察者模式用于重启线程的实例,就顺便研究了一下。观察者模式先引用介绍一下观察者模式:意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决:一个对象状态改变给其......
  • Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目
    Servlet注解的使用,简化配置以及,使用模板方法设计模式优化oa项目每博一文案有句谚语说:“一怒之下踢石头,只有痛着脚趾头。”比一件糟糕的事情更可拍的,是你用糟糕的态度去面对它。看过一个很有意思的故事:有个男人清早洗漱的时候,把自己的手表放在了桌子上。他的儿子不小心把手表......