关于迭代器模式我所知道的

简介: 关于迭代器模式我所知道的

image.png


迭代器是用来遍历容器的,一个完整的迭代器模式一般会涉及容器和容器迭代器两部分内容。

现在流行的大部分语言都已经有了内置的迭代器实现。本质其实就是循环访问聚合对象中的各个元素。

迭代器可以分为内部迭代器和外部迭代器。


内部迭代器


内部已经定义好了迭代规则,它完全接手整个迭代过程,外部只需要一次初始调用


外部迭代器


外部迭代器必须显式地请求迭代下一个元素。

外部迭代器虽然调用方式相对复杂,但它的适用面更广,也能满足更多变的需求。比如常见的 next()nextTick() 等。


// jq 迭代器
$.each([1, 2, 3], (i, n) => console.log('当前下标为: ' + i, '当前值为:' + n));   
// 简单实现内部迭代器
const each = (arr, cb) => {
  arr.forEach((item, index) => cb.call(item, index, item))
}
each([1, 2, 3], (i, n) => console.log([i, n]));
// 简单应用
const compare = (arr1, arr2) => {
  if (arr1.length !== arr2.length) {
    return false;
  }
  let r = true;
  each(arr1, (i, n) => {
    if (n !== arr2[i]) {
      r = false
    }
  })
  return r
}
// 简单实现外部迭代器
class Iterator {
  constructor(obj) {
    this.current = 0;
    this.obj = obj;
    this.length = obj.length;
  }
  next() {
    this.current += 1;
  }
  isDone() {
    return this.current >= this.obj.length;
  }
  getCurItem() {
    return this.obj[this.current];
  }
}
const compare = (iterator1, iterator2) => {
  if (iterator1.length !== iterator2.length) {
    console.log('iterator1和iterator2不相等');
  }
  while (!iterator1.isDone() && !iterator2.isDone()) {
    if (iterator1.getCurItem() !== iterator2.getCurItem()) {
      console.log('iterator1和iterator2不相等')
      return false
    }
    iterator1.next();
    iterator2.next();
  }
  alert('iterator1和iterator2相等');
}
const iterator1 = new Iterator([1,2,3,4])
const iterator2 = new Iterator([1,2,4,4])
compare(iterator1, iterator2)


内部迭代器和外部迭代器在实际生产中没有优劣之分,究竟使用哪个要根据需求场景而定。

拓展应用 倒序迭代器 中止迭代器


// 倒序迭代器
const reverseEach = (arr, cb) => {
  for (let i = arr.length - 1; i >= 0; i--) {
    cb(i, arr[i]);
  }
}
reverseEach([1, 2, 3], (i, n) => console.log(n))
// 中止迭代器 回调函数中包含循环的终止条件
const Each = (arr, cb) => {
  for (let i = 0; i < arr.length; i++) {
    if (cb(i, arr[i]) === false) {
      break
    }
  }
}
Each([1, 2, 3, 4, 5], (i, n) => {
  if (n > 3) { // 中止条件
    return false
  }
  console.log(n) // 1,2,3
})


目录
相关文章
|
存储 编译器 C语言
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-1
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-1
211 0
|
存储 Java API
详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
【10月更文挑战第19天】深入剖析Java Map:不仅是高效存储键值对的数据结构,更是展现设计艺术的典范。本文从基本概念、设计艺术和使用技巧三个方面,详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
235 3
|
存储 设计模式 前端开发
什么是SpringMVC?简单好理解!什么是应用分层?SpringMVC与应用分层的关系? 什么是三层架构?SpringMVC与三层架构的关系?
文章解释了SpringMVC的概念和各部分功能,探讨了应用分层的原因和具体实施的三层架构,以及SpringMVC与三层架构之间的关系和联系。
662 1
什么是SpringMVC?简单好理解!什么是应用分层?SpringMVC与应用分层的关系? 什么是三层架构?SpringMVC与三层架构的关系?
Java Map.Entry接口详解
Java Map.Entry接口详解
|
C++ Python
[ROS2] --- 手动编写一个节点
[ROS2] --- 手动编写一个节点
411 1
matlab使用移动平均滤波器、重采样和Hampel过滤器进行信号平滑处理
matlab使用移动平均滤波器、重采样和Hampel过滤器进行信号平滑处理
|
小程序
微信小程序实现点击复制(wx.setClipboardData)
微信小程序实现点击复制(wx.setClipboardData)
482 0
|
人工智能 Cloud Native PyTorch
阿里云 ACK 云原生 AI 套件中的分布式弹性训练实践
阿里云 ACK 云原生 AI 套件中的分布式弹性训练实践
149128 4
|
自然语言处理 算法 数据库
OpenSearch向量检索和大模型方案深度解读
深度解读开放搜索在向量检索和大模型方面的升级演进。
81852 7
|
消息中间件 存储 Go
Golang微服务框架Kratos应用NSQ消息队列
NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,由bitly公司开源出来的一款简单易用的消息中间件。 NSQ可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息,其设计目标是为在分布式环境下运行的去中心化服务提供一个强大的基础架构。 NSQ具有分布式、去中心化的拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。NSQ非常容易配置和部署,且具有最大的灵活性,支持众多消息协议。
297 1