美文网首页
迭代器模式

迭代器模式

作者: bounsail | 来源:发表于2021-05-09 20:07 被阅读0次

    迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。不关心对象的内部构造,可以按顺序访问其中的每个元素。

    内置迭代器

    如:forEach Iterator等,再如jquery的$.each / for...of
    定义:内部已经定义好了迭代规则,它完全接手整个迭代过程,外部只需要一次初始调用;迭代器模式的核心,就是实现统一遍历接口。
    实现

    var each = function(arr, callBack) {   // 统一遍历接口实现
      for (let i = 0, len = arr.length; i < len; i++) {     // 将值,索引返回给回调函数callBack处理
        if (callBack(i, arr[i]) === false) {
          break;  // 中止迭代器,跳出循环
        }
      }
    }
    each([1, 2, 3, 4, 5], function(index, value) {   // 外部调用
        if (value > 3) {
          return false; // 返回false中止each
        }
        console.log([index, value]);
    })    // 输出:[0, 1]  [1, 2]  [2, 3]
    

    优缺点

    优点:内部迭代器在调用时非常方便,外界不用关心迭代器内部的实现,跟迭代器的交互也仅仅是一次初始调用
    缺点:由于内部迭代器的迭代规则已经被提前规定,上面的 each 函数就无法同时迭代2个数组,如下代码

    var compare = function( ary1, ary2 ){
      if ( ary1.length !== ary2.length ){
        throw new Error ( 'ary1 和ary2 不相等' );
      }
      each( ary1, function( i, n ){
        if ( n !== ary2[ i ] ){
          throw new Error ( 'ary1 和ary2 不相等' );
        }
      });
      alert ( 'ary1 和ary2 相等' );
    };
    compare( [ 1, 2, 3 ], [ 1, 2, 4 ] ); // throw new Error ( 'ary1 和ary2 不相等' );
    

    外部迭代器

    如:ES6 的 yield
    定义:外部迭代器必须显式地请求迭代下一个元素
    实现
    我们模拟一个es6迭代器

    var Iterator = function (ary) {
      this.ary = ary
      this.index = 0
    }
    Iterator.prototype.isDone = function () {
      return this.index >= this.ary.length
    }
    Iterator.prototype.next = function () {
      if (!this.isDone()) {
        var res = this.ary[this.index]
        this.index++
        return {
          value: res,
          done: this.isDone()
        }
      }
    }
    var a = new Iterator([1, 2, 3])
    while (!a.isDone()) {
      console.log(a.next())
    }
    

    下面解决一下上面那个问题

    var a = new Iterator([1, 2, 3, 3])
    var b = new Iterator([1, 2, 3])
    function compare(iterator1, iterator2) {
      while (!iterator1.isDone() || !iterator2.isDone()) {
        if (iterator1.next().value !== iterator2.next().value) {
          return false
        }
      }
      return true
    }
    compare(a, b)
    

    优点:灵活性更佳,适用面广,能应对更加复杂的迭代需求
    缺点:需显示调用迭代进行(手动控制迭代过程),外部调用方式较复杂

    相关文章

      网友评论

          本文标题:迭代器模式

          本文链接:https://www.haomeiwen.com/subject/psxvdltx.html