我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用迭代器模式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用迭代器模式

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

你将学到

  • 迭代器模式的含义

  • 实现一个数组迭代器

  • 实现一个对象迭代器

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

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

  • 实现一个图片播放器

如何使用迭代器模式

正文

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.class="lazy" data-src = imgData[0];      var timer = null;      return {         // 获取第一个图片         first: function() {             index = 0             img.class="lazy" data-src = imgData[index]         },         // 获取最后一个图片         last: function() {             index = len - 1             img.class="lazy" data-src = imgData[index]         },         // 切换到前一张图片         pre: function() {             if(--index > 0) {                 img.class="lazy" data-src = imgData[index]             }else {                 index = 0                 img.class="lazy" data-src = imgData[index]             }         },         // 切换到后一张图片         next: function() {             if(++index < len) {                 img.class="lazy" data-src = imgData[index]             }else {                 index = len - 1                 img.class="lazy" data-src = imgData[index]             }         },         // 自动播放图片         play: function() {             timer = setInterval(() => {                 if(index > len - 1) {                     index = 0                 }                 img.class="lazy" data-src = imgData[index]                 index++             }, 5000)         },         // 停止播放图片         stop: function() {             clearInterval(timer)         }     } }  // 使用 let player = new imgPlayer(imgData, '#box')

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

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用迭代器模式

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

下载Word文档

猜你喜欢

如何在PHP中使用迭代器模式

这篇文章给大家介绍如何在PHP中使用迭代器模式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。php的框架有哪些php的框架:1、Laravel,Laravel是一款免费并且开源的PHP应用框架。2、Phalcon,Ph
2023-06-14

java如何实现迭代器模式

这篇文章主要介绍java如何实现迭代器模式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。类型:行为类模式类图:如果要问java中使用最多的一种
2023-05-30

Python迭代器如何使用

这篇文章主要讲解了“Python迭代器如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python迭代器如何使用”吧!Python 迭代器迭代器是一种对象,该对象包含值的可计数数字。迭
2023-07-05

python如何使用迭代器

小编给大家分享一下python如何使用迭代器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!迭代器(切片)如果对返回一个对象进行简单的操作,会提示生成对象下的“Ty
2023-06-27

如何用迭代器设计模式提升Python性能

本篇内容介绍了“如何用迭代器设计模式提升Python性能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简单案例在开始介绍设计模式之前,我们先
2023-06-15

如何深入理解Java设计模式的迭代器模式

如何深入理解Java设计模式的迭代器模式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、什么是迭代器模式迭代器模式是针对集合对象而生的,对于集合对象而言,肯定
2023-06-25

C++中如何使用迭代器

本篇文章给大家分享的是有关C++中如何使用迭代器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。标准库为每一种标准容器(包括 vector)定义了一种迭代器类型。迭代器类型提供了
2023-06-17

C#中如何使用迭代器

今天就跟大家聊聊有关C#中如何使用迭代器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。创建迭代器最常用的方法是对 IEnumerable 接口实现 GetEnumerator 方法,
2023-06-18

迭代器模式如何在java项目中实现

迭代器模式如何在java项目中实现 ?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java 迭代器模式实例详解首先,为什么使用迭代器模式,目的就是通过一个通用的迭代方法,隐
2023-05-31

每天一个设计模式·迭代器模式

迭代器模式·原文地址更多《设计模式系列教程》更多免费教程博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript(靠这吃饭)和python(纯粹喜欢)两种语言实现。诚然,每种设计模式都有多种实现方式,但此小册只记
2023-01-31

PHP设计模式之迭代器模式浅析

迭代器(Iterator)模式,它在一个很常见的过程上提供了一个抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代。迭代有几种不同的具体执行方法:在数组属性,集合对象,数组,甚至一个查询结果集之上迭代
2023-05-14

Python使用设计模式中的责任链模式与迭代器模式的示例

责任链模式 责任链模式:将能处理请求的对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理请求为止,避免请求的发送者和接收者之间的耦合关系。#encoding=utf-8 # #by panda #职责连模式 def print
2022-06-04

Python迭代器如何创建使用

这篇文章主要介绍“Python迭代器如何创建使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python迭代器如何创建使用”文章能帮助大家解决问题。Python 迭代器迭代器是一种对象,该对象包含
2023-07-06

编程热搜

目录