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

迭代器模式

  迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示。

  迭代器的几个特点是:

  1、访问一个聚合对象的内容而无需暴露它的内部表示。

  2、为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。

  3、遍历的同时更改迭代器所在的集合结构可能会导致问题(比如C#的foreach里不允许修改item)。

  一般的迭代,我们至少要有2个方法,hasNext()和Next(),这样才做做到遍历所有对象,我们先给出一个例子:

var agg = (function () {
    var index = 0,
    data = [1, 2, 3, 4, 5],
    length = data.length;

    return {
        next: function () {
            var element;
            if (!this.hasNext()) {
                return null;
            }
            element = data[index];
            index = index + 2;
            return element;
        },
        hasNext: function () {
            return index < length;
        },
        rewind: function () {
            index = 0;
        },
        current: function () {
            return data[index];
        }
    };
}());

  使用方法:

/ 迭代的结果是:1,3,5
while (agg.hasNext()) {
    console.log(agg.next());
}

  当然,你也可以通过额外的方法来重置数据,然后再继续其它操作:

// 重置
agg.rewind();
console.log(agg.current()); // 1

  jQuery里一个非常有名的迭代器就是$.each方法,通过each我们可以传入额外的function,然后来对所有的item项进行迭代操作,例如:

$.each(['dudu', 'dudu', '酸奶小妹', '那个MM'], function (index, value) {
    console.log(index + ': ' + value);
});
//或者
$('li').each(function (index) {
    console.log(index + ': ' + $(this).text());
});

  迭代器的使用场景是:对于集合内部结果常常变化各异,我们不想暴露其内部结构的话,但又想让客户代码能够访问其中的元素,这种情况下我们可以使用迭代器模式。

 

相关文章:

  • Android 中的子线程解析
  • Java基础之Java常用类--Object类,字符串相关类,包装类,日期相关类,数字相关类...
  • 195. Spring Boot 2.0数据库迁移:Flyway
  • opencv python Meanshift 和 Camshift
  • Scala基础
  • mysql进阶(七)数据库锁
  • caffe问题
  • HDU 6330--Visual Cube(构造,计算)
  • mysql 数据库修改名字
  • 设计模式-简单工厂、工厂方法模式、抽象工厂模式详解
  • 9种数据分析方法
  • 人群估值一般性算法
  • oracle获取过去两年的今天时间
  • SOFATracer 中 Disruptor 实践
  • C#抽象类与接口的区别【转】
  • #Java异常处理
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • HTML5新特性总结
  • javascript从右向左截取指定位数字符的3种方法
  • Javascript弹出层-初探
  • JAVA之继承和多态
  • Mybatis初体验
  • Node 版本管理
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • PHP面试之三:MySQL数据库
  • ReactNativeweexDeviceOne对比
  • React的组件模式
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Tornado学习笔记(1)
  • 从零搭建Koa2 Server
  • 分享几个不错的工具
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 排序算法学习笔记
  • 前端攻城师
  • 前嗅ForeSpider教程:创建模板
  • 三栏布局总结
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #DBA杂记1
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (C++17) std算法之执行策略 execution
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (pojstep1.3.1)1017(构造法模拟)
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (已解决)什么是vue导航守卫
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET BackgroundWorker
  • .net分布式压力测试工具(Beetle.DT)
  • .NET连接数据库方式
  • .NET中 MVC 工厂模式浅析
  • .py文件应该怎样打开?
  • @angular/cli项目构建--http(2)
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?