广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >如何使用迭代器模式
  • 914
分享到

如何使用迭代器模式

2024-04-02 19:04:59 914人浏览 独家记忆
摘要

这篇文章主要讲解了“如何使用迭代器模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用迭代器模式”吧!你将学到迭代器模式的含义实现一个数组迭代器实现一

这篇文章主要讲解了“如何使用迭代器模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用迭代器模式”吧!

你将学到

  • 迭代器模式的含义

  • 实现一个数组迭代器

  • 实现一个对象迭代器

  • 实现路径查找/赋值迭代器

  • 如何用迭代器的思想解决分支循环嵌套问题

  • 实现一个图片播放器

如何使用迭代器模式

正文

1.迭代器的含义

  • 迭代器模式主要的思想就是在不暴露对象内部结构的同时可以按照一定顺序访问对象内部的元素。

其实javascript中的很多方法都运用了迭代器的思想,比如数组的forEach,every,find,some,map,entries等等,这些操作极大的简化了我们的逻辑操作,接下来我们就来看看它的具体应用吧。

2.实现一个数组迭代器

我们都知道javascript中数组的forEach方法,那么不用这个方法,我们能自己实现一个吗?

// 数组迭代器 let eachArr = function(arr, fn) {     let i = 0,     len = arr.length;     for(; i < len; i++) {         if(fn.call(arr[i], i, arr[i]) === false) {             break;         }     } }  // 使用 eachArr([1,2,3,4], (index, value) => { console.log(index, value) })

3.实现一个对象迭代器

对象迭代器和数组迭代器类似, 只是传参不同,如下:

// 对象迭代器 let eachObj = function(obj, fn) {     for(let key in obj) {         if(fn.call(obj[key], key, obj[key]) === false) {             break;         }     } }  // 使用 eachObj({a: 11, b: 12}, (key, value) => { console.log(key, value) })

4.实现路径查找/赋值迭代器

有时候我们操作对象的某些属性时,我们不知道服务器端是否将该属性或者该属性的上级属性正确的返回给我们,这个时候我们直接通过点语法或者[]语法直接访问会导致代码报错,因此需要我们每一层操作都要做安全校验,这样会产生大量臃肿代码,比如:

let obj = {}; // 获取 obj.num.titNum let titNum = obj.num.titNum;    // 报错 let titNum = obj && obj.num && obj.num.titNum;   // 正确

我们通过迭代器可以极大的减少这种校验,实现更健壮的代码模式:

let findObjAttr = function(obj, key){     if(!obj || !key) {         return undefined     }     let result = obj;     key = key.split('.');     for(let i =0; len = key.length; i< len; i++) {         if(result[key[i]] !== undefined) {             result = result[key[i]]         }else {             return undefined         }     }     return result } // 使用 let a = { b: { c: { d: 1 } } }; findObjAttr(a, 'a.b.c.d')     // 1

这种方式是不是有点类似于lodash的对象/数组查找器呢?同理,我们也可以实现路径赋值器,如下所示:

let setObjAttr = function(obj, key, value){     if(!obj) {         return false     }     let result = obj,     key = key.split('.');     for(let i =0, len = key.length; i< len - 1; i++){         if(result[key[i]] === undefined) {             result[key[i]] = {};         }                  if(!(result[key[i]] instanceof Object)){             // 如果第i层对应的不是一个对象,则剖出错误             throw new Error('is not Object')             return false         }                  result = result[key[i]]     }     return result[key[i]] = val }  // 使用 setObjAttr(obj, 'a.b.c.d', 'xuxi')

5.如何用迭代器的思想解决分支循环嵌套问题

分支循环嵌套的问题主要是指在循环体中还需要进行额外的判断,如果判断条件变多,将会造成严重的性能开销问题,如下面的例子:

// 数据分组 function group(name, num) {     let data = [];     for(let i = 0; i < num; i++){         switch(name) {             case 'header':                data[i][0] = 0;                data[i][1] = 1;                break;            case 'content':                data[i][0] = 2;                data[i][1] = 3;                break;            case 'footer':                data[i][0] = 4;                data[i][1] = 532;                break;            default:                break;         }     }     return data }

由以上分析可知,上面的代码还有很多优化空间,因为每一次遍历都要进行一次分支判断,那么如果num变成100000,且name的种类有100种,那么我们就要做100000*100种无用的分支判断,这样无疑会让你的代码在大数据下卡死。不过我们可以通过以下这种方式优化它:

// 数据分组 function group(name, num) {     let data = [];     let strategy = function() {         let deal = {             'default': function(i){                 return             },             'header': function(i){                data[i][0] = 0;                data[i][1] = 1;             },            'content': function(i){                data[i][0] = 2;                data[i][1] = 3;             },              //...         }         return function(name) {             return deal[name] || deal['default']         }     }();     // 迭代器处理数据     function _each(fn) {        for(let i = 0; i < num; i++){         fn(i)        }     }          _each(strategy(name))          return data }

这样我们就能避免分支判断,极大的提高了代码效率和性能。

6.实现一个图片播放器

如何使用迭代器模式

图片播放器主要有以上几个功能,上一页,下一页,首页,尾页,自动播放按钮,停止按钮。具体组件的设计机构可以参考我写的demo:

// 图片播放器 let imgPlayer = function(imgData, box) {     let container = box && document.querySelector(box) || document,     img = container.querySelector('img'),     // 获取图片长度     len = imgData.length,     // 当前索引值     index = 0;     // 初始化图片     img.src = imgData[0];      var timer = null;      return {         // 获取第一个图片         first: function() {             index = 0             img.src = imgData[index]         },         // 获取最后一个图片         last: function() {             index = len - 1             img.src = imgData[index]         },         // 切换到前一张图片         pre: function() {             if(--index > 0) {                 img.src = imgData[index]             }else {                 index = 0                 img.src = imgData[index]             }         },         // 切换到后一张图片         next: function() {             if(++index < len) {                 img.src = imgData[index]             }else {                 index = len - 1                 img.src = imgData[index]             }         },         // 自动播放图片         play: function() {             timer = setInterval(() => {                 if(index > len - 1) {                     index = 0                 }                 img.src = imgData[index]                 index++             }, 5000)         },         // 停止播放图片         stop: function() {             clearInterval(timer)         }     } }  // 使用 let player = new imgPlayer(imgData, '#box')

总之,迭代器思想和其他设计模式的组合,可以设计出各种各样高度配置的组件,所以说学好并理解 javascript  设计模式的精髓,决定了我们的高度和态度。

感谢各位的阅读,以上就是“如何使用迭代器模式”的内容了,经过本文的学习后,相信大家对如何使用迭代器模式这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 如何使用迭代器模式

本文链接: https://www.lsjlt.com/news/84034.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用迭代器模式
    这篇文章主要讲解了“如何使用迭代器模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用迭代器模式”吧!你将学到迭代器模式的含义实现一个数组迭代器实现一...
    99+
    2022-10-19
  • 如何在PHP中使用迭代器模式
    这篇文章给大家介绍如何在PHP中使用迭代器模式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。php的框架有哪些php的框架:1、Laravel,Laravel是一款免费并且开源的PHP应用框架。2、Phalcon,Ph...
    99+
    2023-06-14
  • PHP设计模式之迭代器模式的使用
    目录Gof类图及解释实例一说到这个模式,就不得不提循环语句。在《大话设计模式》中,作者说道这个模式现在的学习意义更大于实际意义,这是为什么呢?当然就是被foreach这货给整得。任何...
    99+
    2022-11-12
  • java如何实现迭代器模式
    这篇文章主要介绍java如何实现迭代器模式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。类型:行为类模式类图:如果要问java中使用最多的一种...
    99+
    2023-05-30
    java
  • javascript设计模式之迭代器模式
    目录迭代器模式介绍示例迭代器模式UML类图迭代器模式原生代码演示迭代器模式的场景ES6 Iterator示例总结迭代器模式介绍 顺序访问一个集合 顺序:如数组、类数组称为顺序,而非对...
    99+
    2022-11-12
  • Java设计模式之迭代器模式
    本文介绍设计模式中的迭代器模式,首先通俗的解释迭代器模式的基本概念和对应的四个角色,并根据四个角色举一个典型的实例,为了加强知识的连贯性,我们以Jdk源码集合中使用迭代器模式的应用进...
    99+
    2022-11-13
  • 如何深入理解Java设计模式的迭代器模式
    如何深入理解Java设计模式的迭代器模式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、什么是迭代器模式迭代器模式是针对集合对象而生的,对于集合对象而言,肯定...
    99+
    2023-06-25
  • C#设计模式实现之迭代器模式
    目录前言:一、餐馆合并菜单 二、改进菜单实现 三、迭代器模式 总结前言: 迭代器模式平时用的不多,因为不管C#还是Java都已经帮我封装了,但是你是否知道平时经常在用的东西本质是怎么...
    99+
    2022-11-12
  • 每天一个设计模式·迭代器模式
    迭代器模式·原文地址 更多《设计模式系列教程》 更多免费教程 博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript(靠这吃饭)和python(纯粹喜欢)两种语言实现。诚然,每种设计模式都有多种实现方式,...
    99+
    2023-01-31
    模式 迭代
  • PHP设计模式之迭代器模式浅析
    目录迭代器模式PHP中的迭代器模式迭代器模式 迭代器模式(Iterator Pattern)是一种常用的设计模式,用于遍历集合中的元素,不暴露集合的内部结构。迭代器模式将集合和遍历分...
    99+
    2023-05-14
    PHP迭代器模式 PHP 设计模式 迭代器模式
  • 如何用迭代器设计模式提升Python性能
    本篇内容介绍了“如何用迭代器设计模式提升Python性能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简单案例在开始介绍设计模式之前,我们先...
    99+
    2023-06-15
  • 如何使用迭代器
    本篇内容介绍了“如何使用迭代器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!阅读下面这段代码,请写出这段代...
    99+
    2022-10-19
  • Java设计模式之java迭代器模式详解
    目录前言介绍角色迭代器模式中的工厂模式学院遍历的案例分析解决方案基本介绍原理类图上面案例的类图案例实现代码案例总结应用实例Java集合中的迭代器模式角色说明Mybatis中的迭代器模...
    99+
    2022-11-12
  • Java设计模式中的迭代器模式详解
    目录一 定义二 UML类图三 代码实例四 迭代器模式的优缺点4.1 优点4.2 缺点五 使用场景六 JDK迭代器的运用一 定义 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露...
    99+
    2023-02-08
    Java迭代器模式 Java设计模式
  • Python使用设计模式中的责任链模式与迭代器模式的示例
    责任链模式 责任链模式:将能处理请求的对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理请求为止,避免请求的发送者和接收者之间的耦合关系。 #encoding=utf-8 # #by pan...
    99+
    2022-06-04
    模式 示例 迭代
  • 迭代器模式如何在java项目中实现
    迭代器模式如何在java项目中实现 ?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java 迭代器模式实例详解首先,为什么使用迭代器模式,目的就是通过一个通用的迭代方法,隐...
    99+
    2023-05-31
    java 迭代器模式 ava
  • .Net行为型设计模式之迭代器模式(Iterator)
    目录一、动机(Motivate)二、意图(Intent)三、结构图四、模式的组成五、迭代器模式的代码实现六、迭代器模式的实现要点:迭代器模式的优点:迭代器模式的缺点:迭代器模式的使用...
    99+
    2022-11-13
  • 深入理解Java设计模式之迭代器模式
    目录一、什么是迭代器模式二、迭代器模式的结构三、迭代器模式的使用场景四、迭代器模式的优缺点优点:缺点:五、迭代器模式的实现抽象聚合类迭代器抽象类具体聚合类具体迭代器类客户端调用六、N...
    99+
    2022-11-12
  • PHP设计模式之迭代器模式怎么实现
    本篇内容主要讲解“PHP设计模式之迭代器模式怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP设计模式之迭代器模式怎么实现”吧!迭代器模式迭代器模式(Iterator Pattern)...
    99+
    2023-07-05
  • python如何使用迭代器
    小编给大家分享一下python如何使用迭代器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!迭代器(切片)如果对返回一个对象进行简单的操作,会提示生成对象下的“Ty...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作