当前位置: 首页 > news >正文

【前端设计模式】之迭代器模式

迭代器模式是一种行为设计模式,它允许我们按照特定的方式遍历集合对象,而无需暴露其内部实现。在前端开发中,迭代器模式可以帮助我们更好地管理和操作数据集合。

迭代器模式特性

  1. 封装集合对象的内部结构,使其对外部透明。
  2. 提供一种统一的遍历方式,无需关心集合对象的具体实现。
  3. 支持多种遍历方式,如正向、反向、跳跃等。

应用示例

1. 数组迭代器

 
class ArrayIterator {constructor(array) {this.array = array;this.index = 0;}hasNext() {return this.index < this.array.length;}next() {return this.array[this.index++];}
}const array = [1, 2, 3, 4, 5];
const iterator = new ArrayIterator(array);while (iterator.hasNext()) {console.log(iterator.next());
}

上述示例定义了一个名为 ArrayIterator 的类,该类用于迭代一个数组。这个类有两个方法:hasNext 和 next

  • hasNext 方法检查是否还有下一个元素。如果有,它返回 true;否则,返回 false
  • next 方法返回当前元素并将索引递增,从而准备访问下一个元素。

然后,代码创建了一个名为 array 的数组,接下来,它使用这个数组创建一个 ArrayIterator 实例。

最后,使用 while 循环和 hasNext 方法来检查是否还有下一个元素。如果有,它就使用 next 方法来获取该元素并将其打印到控制台。这个过程会一直持续到没有更多元素为止。

2. 对象迭代器

 
class ObjectIterator {constructor(object) {this.object = object;this.keys = Object.keys(object);this.index = 0;}hasNext() {return this.index < this.keys.length;}next() {const key = this.keys[this.index++];return { key, value: this.object[key] };}
}const object = { name: 'John', age: 25, gender: 'male' };
const iterator = new ObjectIterator(object);while (iterator.hasNext()) {const { key, value } = iterator.next();console.log(`${key}: ${value}`);
}

上述示例定义了一个名为 ObjectIterator 的类,该类用于迭代一个对象。这个类有三个属性:

  • object:传入的对象。
  • keys:对象的键名数组。
  • index:当前迭代到的键的索引。

它有两个方法:

  • hasNext:检查是否还有下一个键-值对。如果有,返回 true;否则,返回 false
  • next:返回当前迭代到的键和对应的值,并将索引递增,以便下一次迭代。

然后,创建了一个名为 object 的对象,其中包含三个属性:nameage 和 gender。接下来,它使用这个对象创建一个 ObjectIterator 实例。

最后,代码使用 while 循环和 hasNext 方法来检查是否还有下一个键-值对。如果有,它就使用 next 方法来获取该键-值对并将其打印到控制台。这个过程会一直持续到没有更多键-值对为止。

优缺点

优点
  1. 提供一种统一的遍历方式,简化代码逻辑。
  2. 封装集合对象的内部结构,提高代码的可维护性和可扩展性。
  3. 支持多种遍历方式,灵活性高。
缺点
  1. 增加了额外的类和方法,增加了代码复杂度。
  2. 对于简单的数据集合,使用迭代器模式可能会显得过于繁琐。

总结

迭代器模式是一种非常有用的设计模式,在前端开发中可以帮助我们更好地管理和操作数据集合。它通过封装集合对象的内部结构,并提供统一的遍历方式,使得代码更加简洁、可维护和可扩展。然而,在使用迭代器模式时需要权衡其优缺点,并根据具体情况进行选择。

相关文章:

【前端设计模式】之迭代器模式

迭代器模式是一种行为设计模式&#xff0c;它允许我们按照特定的方式遍历集合对象&#xff0c;而无需暴露其内部实现。在前端开发中&#xff0c;迭代器模式可以帮助我们更好地管理和操作数据集合。 迭代器模式特性 封装集合对象的内部结构&#xff0c;使其对外部透明。提供一…...

【Android知识笔记】图片专题(BitmapDrawable)

如何计算一张图片的占用内存大小? 注意是占用内存,不是文件大小可以运行时获取重要的是能直接掌握计算方法基础知识 Android 屏幕像素密度分类: (其实还有一种 ldpi = 120,不过这个已经绝种了,所以最低的只需关心mdpi即可) 上表中的比例为:m : h : xh : xxh: xxxh = …...

前端工程化知识系列(10)

目录 91. 了解前端工程化中的容器化和云部署概念&#xff0c;以及如何使用Docker和Kubernetes等工具来实现它们&#xff1f;92. 你如何管理前端项目的文档和知识共享&#xff0c;以确保团队成员都能理解和使用前端工程化工具和流程&#xff1f;93. 了解前端开发中的大规模和跨团…...

大数据flink篇之三-flink运行环境安装(一)单机Standalone安装

一、安装包下载地址 https://archive.apache.org/dist/flink/flink-1.15.0/ 二、安装配置流程 前提基础&#xff1a;Centos环境&#xff08;建议7以上&#xff09; 安装命令&#xff1a; 解压&#xff1a;tar -zxvf flink-xxxx.tar.gz 修改配置conf/flink-conf.yaml&#xff1…...

Redisson使用延时队列

延时队列 在开发中&#xff0c;有时需要使用延时队列。 比如&#xff0c;订单15分钟内未支付自动取消。 jdk延时队列 如果使用 jdk自带的延时队列&#xff0c;那么服务器挂了或者重启时&#xff0c;延时队列里的数据就会失效&#xff0c;可用性比较差。 Redisson延时队列 …...

基于php 进行每半小时钉钉预警

前言 业务场景&#xff1a;监控当前业务当出现并发情况时技术人员可以可以及时处理 使用技术栈&#xff1a; laravelredis 半小时触发一次报警信息实现思路 1、xshell脚本 具体参数就不详细解释了&#xff0c;想要详细了解可以自行百度 curl -H "Content-Type:appl…...

5.Python-使用XMLHttpRequest对象来发送Ajax请求

题记 使用XMLHttpRequest对象来发送Ajax请求&#xff0c;以下是一个简单的实例和操作过程。 安装flask模块 pip install flask 安装mysql.connector模块 pip install mysql-connector-python 编写app.py文件 app.py文件如下&#xff1a; from flask import Flask, reque…...

八皇后问题的解析与实现

问题描述 八皇后问题是一个古老而又著名的问题。 时间退回到1848年,国际西洋棋棋手马克斯贝瑟尔提出了这样的一个问题: 在88格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法。 如何找到这所有的…...

论文浅尝 | 深度神经网络的模型压缩

笔记整理&#xff1a;闵德海&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://arxiv.org/abs/1412.6550 动机 提高神经网络的深度通常可以提高网络性能&#xff0c;但它也使基于梯度的训练更加困难&#xff0c;因为更深的网络往往更加强的非线…...

进阶JAVA篇- DateTimeFormatter 类与 Period 类、Duration类的常用API(八)

目录 1.0 DateTimeFormatter 类的说明 1.1 如何创建格式化器的对象呢&#xff1f; 1.2 DateTimeFormatter 类中的 format&#xff08;LocalDateTime ldt&#xff09; 实例方法 2.0 Period 类的说明 2.1 Period 类中的 between(localDate1,localDate2) 静态方法来创建对象。 3.…...

1.1 Windows驱动开发:配置驱动开发环境

在进行驱动开发之前&#xff0c;您需要先安装适当的开发环境和工具。首先&#xff0c;您需要安装Windows驱动开发工具包&#xff08;WDK&#xff09;&#xff0c;这是一组驱动开发所需的工具、库、示例和文档。然后&#xff0c;您需要安装Visual Studio开发环境&#xff0c;以便…...

Jetpack:009-kotlin中的lambda、匿名函数和闭包

文章目录 1. 概念介绍2. 使用方法2.1 函数类型的变量2.2 高阶函数 3. 内容总结4.经验分享 我们在上一章回中介绍了Jetpack中Icon和Imamg相关的内容&#xff0c;本章回中主要介绍Kotlin中的 lambda、匿名函数和闭包。闲话休提&#xff0c;让我们一起Talk Android Jetpack吧&…...

openGauss指定schema下全部表结构备份与恢复

本次测试针对openGauss版本为2.0.5 gs_dump指定schema下全部表结构信息备份 gs_dump database_name -U username -p port -F c -s -n schema_name -f schema.sqldatabase_name&#xff1a;数据库名&#xff0c;要备份的数据库名称 username&#xff1a;用户名&#xff0c;数据…...

干货:如何在前端统计用户访问来源?

在前端统计用户访问来源是一个常见的需求&#xff0c;通过获取访问来源信息&#xff0c;我们可以了解用户是通过直接访问、搜索引擎、外部链接等途径进入我们的网站或应用。下面是一个详细的介绍&#xff0c;包括方法和实现步骤。 一、获取HTTP Referer HTTP Referer是HTTP请…...

李宏毅生成式AI课程笔记(持续更新

01 ChatGPT在做的事情 02 预训练&#xff08;Pre-train&#xff09; ChatGPT G-Generative P-Pre-trained T-Transformer GPT3 ----> InstructGPT&#xff08;经过预训练的GPT3&#xff09; 生成式学习的两种策略 我们在使用ChatGPT的时候会注意到&#xff0c;网站上…...

nodejs+vue+elementui酒店客房服务系统mysql带商家

视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面要能够和控制器类进行交互&#xff0c;从而使得用户在点击网页进行操作时能够正常。 简单的说 Node.js 就是运行在服务端的 JavaScript。 前端技术&#xff1a;nodejsvueel…...

【网络协议】聊聊网络分层

常用的网络协议 首先我们输入www.taobao.com&#xff0c;会先经过DNS进行域名解析&#xff0c;转换为59.82.122.115的公网IP地址。然后就会发起请求&#xff0c;一般来说非加密的使用http&#xff0c;加密的使用https。上面是在应用层做的处理&#xff0c;那么接下来就是到传输…...

[开源]基于Vue+ElementUI+G2Plot+Echarts的仪表盘设计器

一、开源项目简介 基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的仪表盘设计器&#xff0c;具备仪表盘目录管理、仪表盘设计、仪表盘预览能力&#xff0c;支持MySQL、Oracle、PostgreSQL、MSSQL、JSON等数据集接入&#xff0c;对于复杂数据处理还可以使用…...

html设置前端加载动画

主体思路参考&#xff1a; 前端实现页面加载动画_边城仔的博客-CSDN博客 JS图片显示与隐藏案例_js控制图片显示隐藏-CSDN博客 1、编写load.css /* 显示加载场景 */ .loadBackGround{position: absolute;top: 0px;text-align: center;width: 100%;height: 100vh;background-c…...

【git的使用方法】——上传文件到gitlab仓库

先进入到你克隆下来的仓库的目录里面 比如&#xff1a;我的仓库名字为zhuox 然后将需要上传推送的文件拷贝到你的克隆仓库下 这里的话我需要拷贝的项目是t3 输入命令ls&#xff0c;就可以查看该文件目录下的所有文件信息 然后输入git add 文件名 我这边输入的是 &#x…...

Halcon图像高效转换:HObject到Bitmap的优化实践(20ms内完成)

1. 为什么需要HObject到Bitmap的高效转换 在工业视觉和深度学习应用中&#xff0c;Halcon的HObject图像格式和Windows平台的Bitmap格式就像两个说着不同语言的人。我遇到过太多这样的场景&#xff1a;当我们需要把Halcon处理后的图像交给TensorFlow做推理&#xff0c;或者要在…...

解锁Audacity:5个零成本音频处理功能彻底改变你的创作流程

解锁Audacity&#xff1a;5个零成本音频处理功能彻底改变你的创作流程 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 价值定位&#xff1a;为什么Audacity是音频创作者的必备工具 在音频编辑领域&#xff0c;专…...

Obsidian Copilot 深度解析:构建知识管理中的智能代理系统

Obsidian Copilot 深度解析&#xff1a;构建知识管理中的智能代理系统 【免费下载链接】obsidian-copilot A ChatGPT Copilot in Obsidian 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-copilot 在知识管理工具日益同质化的今天&#xff0c;Obsidian Copilot …...

PP-DocLayoutV3入门必看:从零部署到JSON结构化输出完整流程

PP-DocLayoutV3入门必看&#xff1a;从零部署到JSON结构化输出完整流程 1. 开篇&#xff1a;认识文档布局分析利器 你是否曾经遇到过这样的困扰&#xff1a;面对扫描的文档图片&#xff0c;想要提取其中的文字和结构信息&#xff0c;却不知道从何下手&#xff1f;或者需要处理…...

手机号与QQ号关联查询工具:技术原理与实战指南

手机号与QQ号关联查询工具&#xff1a;技术原理与实战指南 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 破解数字身份关联难题&#xff1a;phone2qq工具的价值定位 在多账号管理场景中&#xff0c;用户经常面临数字身份关联断层问…...

如何快速上手OneMore:OneNote插件的安装与基础设置教程

如何快速上手OneMore&#xff1a;OneNote插件的安装与基础设置教程 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore 想要提升OneNote的使用效率吗&#xff1f;OneMore插…...

3个关键步骤让LyricsX成为你的Mac音乐伴侣:从基础到精通

3个关键步骤让LyricsX成为你的Mac音乐伴侣&#xff1a;从基础到精通 【免费下载链接】LyricsX &#x1f3b6; Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX LyricsX是一款专为macOS设计的歌词工具&#xff0c;能够智能同步显示…...

OpenClaw 中所有浏览器控制方法总览

OpenClaw 当前支持的浏览器控制方式&#xff0c;本质可以分为 3 种架构路径&#xff1a; Remote CDP&#xff08;直接协议控制&#xff09; Managed Browser&#xff08;托管浏览器&#xff09; Existing-session via Chrome DevTools MCP&#xff08;会话接管&#xff09; …...

gte-base-zh Docker Compose部署:一键编排Xinference+gte-base-zh+WebUI服务栈

gte-base-zh Docker Compose部署&#xff1a;一键编排Xinferencegte-base-zhWebUI服务栈 1. 引言&#xff1a;为什么需要一键部署文本嵌入服务&#xff1f; 如果你正在做智能客服、文档检索或者内容推荐系统&#xff0c;肯定遇到过一个问题&#xff1a;怎么让计算机真正“理解…...

从Bootloader到App的优雅跳转:关键步骤与实战解析

1. 为什么需要Bootloader跳转App&#xff1f; 在嵌入式开发中&#xff0c;Bootloader和App的关系就像电脑的BIOS和操作系统。Bootloader负责硬件初始化、固件更新等底层工作&#xff0c;而App则是实现具体业务逻辑的主程序。两者分工明确&#xff0c;但最终需要无缝衔接。 我遇…...