设计模式 ~ 迭代器模式

这篇具有很好参考价值的文章主要介绍了设计模式 ~ 迭代器模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概念

迭代器是一种设计模式,提供了一种顺序访问集合或容器中元素的方法,无需暴露集合的内部结构,for 循环并不是迭代器模式 ,forEach 是最简易的迭代器。


理解

  • 以下函数实现了 next 方法,调用该方法返回集合中的下一个元素
  • value 表示当前迭代到的元素值
  • done 表示迭代是否已经结束
const makeIterator = (arr = []) => {
  let nextIndex = 0
  return {
    next() {
      if (nextIndex < arr.length) {
        return { value: arr[nextIndex++], done: false }
      } else {
        return { value: undefined, done: true }
      }
    }
  }
}

let it = makeIterator([10, 20])
console.log(it.next()) // {value: 10, done: false}
console.log(it.next()) // {value: 20, done: false}
console.log(it.next()) // {value: undefined, done: true}

Symbol.iterator

  • 可迭代协议:它是一个内置符号,用于定义一个对象的默认迭代器,提供 next 方法用于生成序列中的值;
  • 所有的 有序结构 内置 Symbol.iterator 且均可使用 for...of 、解构、扩展操作符、Array.from等;
  • 常见有序结构:Array、String、元组(Tuple)、链表、集合(Set)、字典(Map)、arguments、NodeList
const arr = new Array(10, 20)
const iterator = arr[Symbol.iterator]()
console.log(iterator.next()) // {value: 10, done: false}
console.log(iterator.next()) // {value: 20, done: false}
console.log(iterator.next()) // {value: undefined, done: true}

实现原理:

interface IteratorReturn {
  value: number
  done: boolean
}
class DataIterator {
  private data: any[]
  private index = 0 // 当前下标
  constructor(container: myArray) {
    this.data = container.data
  }
  next(): IteratorReturn | null {
    if (this.hasNext()) {
      return {
        value: this.data[this.index++],
        done: !this.hasNext()
      }
    }
    return null
  }
  hasNext(): boolean {
    if (this.index > this.data.length) return false
    return true
  }
}

class myArray {
  data = [10, 20, 30] // 假设这个一个数组的构造函数
  'Symbol.iterator'() {
    return new DataIterator(this) // 获取迭代器
  }
}

const itArr = new myArray()
const iterator = itArr['Symbol.iterator']() // 获取迭代器
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())

不可迭代协议

非有序结构可以使用 Symbol.iterator 创建一个可迭代对象,不同结构设计不同的算法文章来源地址https://www.toymoban.com/news/detail-601955.html

let obj = {
  key1: [1, 2],
  key2: [5, 6],
  key3: [9, 10]
}
obj[Symbol.iterator] = function () {
  const self = this
  let keys = Reflect.ownKeys(self)
  let values = []
  return {
    next() {
      if (!values.length) {
        if (keys.length) {
          values = self[keys[0]] // 从 frontend 开始获取
          keys.shift() // 依此删除 key
        }
      }
      return {
        done: !values.length, // 取完后则为 true
        value: values.length ? values.shift() : undefined // 返回删除的结果
      }
    }
  }
}

let itObj = obj[Symbol.iterator]()
console.log(itObj.next())

Generator、yield

  • 一种特殊的函数,它可以在迭代过程中暂停和恢复执行;
  • 生成器函数使用 function* 关键字进行声明;
  • 生成器函数通过使用 yield 关键字来定义要生成的值;
  • 每一次 next 的执行到 yield 停止,并返回当前 yield 之后对应的值
  • next() 可以传参,即上一个 yield 的值
function* foo() {
  for (let i = 0; i < 3; i++) {
    yield i
  }
}
let f = foo()
console.log(f.next()) // {value: 0, done: false}
console.log(f.next()) // {value: 1, done: false}
console.log(f.next()) // {value: 2, done: false}
console.log(f.next()) // {value: undefined, done: true}
function* count(x = 1) {
  while (true) {
    if (x % 7 === 0) {
      yield x
    }
    x++
  }
}
let n = count()
console.log(n.next()) // {value: 7, done: false}
console.log(n.next()) // {value: 14, done: false}

yield*

  • yield* 是 TS 中的一个关键字,作用是将控制权从一个生成器转移给另一个生成器或可迭代对象 ;
  • yield* 之后必须是有序结构的数据,即实现了 Symbol.Iterator
const gener = [10, 20, 30]
function* foo() {
	yield* gener // 相当于 yield 10 yield 20 yield 30
}

到了这里,关于设计模式 ~ 迭代器模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式——迭代器模式15

    迭代器模式提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。 设计模式,一定要敲代码理解 迭代器模式将数据存储和数据遍历的职责进行分离。但针对不同结构的迭代对象,迭代方式需进行添加。 代码下载

    2024年04月15日
    浏览(46)
  • 设计模式行为型——迭代器模式

    目录 迭代器模式的定义 迭代器模式的实现 迭代器模式角色 迭代器模式类图 迭代器模式代码实现 迭代器模式的特点 优点 缺点 使用场景 注意事项         迭代器模式(Iterator Pattern)属于行为型模式,其提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对

    2024年02月14日
    浏览(36)
  • 行为型设计模式——迭代器模式

    迭代器模式也是非常的简单, 定义如下: 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 相信大家都使用过类似下面的迭代器: 如果在你的项目中需要对一个自定义的集合进行迭代遍历,那么迭代器模式是非常需要学习的。迭代器模式主

    2024年01月18日
    浏览(42)
  • Java 设计模式——迭代器模式

    迭代器模式 (Iterator Pattern) 是一种行为型设计模式, 它提供一种顺序访问聚合对象(如列表、集合等)中的元素,而无需暴露聚合对象的内部表示 。迭代器模式将遍历逻辑封装在一个 迭代器对象 中,使得我们可以使用统一的方式遍历不同类型的聚合对象,同时也可以简化客

    2024年02月16日
    浏览(37)
  • 设计模式学习笔记 - 设计模式与范式 -行为型:9.迭代器模式(上):相比直接遍历集合数据,使用迭代器模式有哪些优势?

    上篇文章,我们学习了状态模式。状态模式是状态机的一种实现方式。它通过将事件触发的状态转移和动作执行,拆分到不同的状态类中,以此来避免状态机类中的分支判断逻辑,应对状态机类代码的复杂性。 本章,学习另外一种行为型设计模式,迭代器模式。它用来遍历集

    2024年04月15日
    浏览(57)
  • C#设计模式之---迭代器模式

    迭代器模式(Iterator Pattern)是一种对象行为模式,提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。支持在聚集中移动游标,使得访问聚合中的元素变得简单,简化了聚集的接口,封装了聚合的对象。 迭代器模式还可以应用于对树结构的访

    2024年02月13日
    浏览(51)
  • 经典的设计模式15——迭代器模式

    迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 就是说当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式。需要对聚集有多种方式遍历时,可以考虑用迭代器模式,比如从头到尾遍

    2024年02月09日
    浏览(76)
  • 《设计模式的艺术》笔记 - 迭代器模式

            迭代器模式提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。 myclass.h myclass.cpp main.cpp         1. 支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。在迭代

    2024年01月24日
    浏览(46)
  • C++设计模式之迭代器模式

    【声明】本题目来源于卡码网(https://kamacoder.com/) 【提示:如果不想看文字介绍,可以直接跳转到 C++编码部分 】         --什么是迭代器模式(第19种设计模式)          迭代器模式 是⼀种 行为设计模式 ,是⼀种使⽤频率⾮常⾼的设计模式,在各个语⾔中都有应用,

    2024年01月24日
    浏览(40)
  • 津津乐道设计模式 - 迭代器模式详解(以购物车的场景来演示迭代器模式)

    😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包