# 迭代器模式

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。

迭代器分为内部迭代器和外部迭代器,它们有各自的使用场景。

  • 内部迭代器
function each(ary, callback) {
  for (var i = 0; i < ary.length; i++) {
    callback(i, ary[i])
  }
}
each([2, 4, 6, 8, 10], function (i, item) {
  console.log(i, item)
})

优点:内部迭代器在调用的时候非常方便,外界不用关心迭代器内部的实现,跟迭代器的交互也仅 仅是一次初始调用。

缺点:由于内部迭代器的迭代规则已经被提前规 定,上面的 each 函数就无法同时迭代2个数组,如下代码就显得不太优雅。

function each(ary, callback) {
  for (var i = 0; i < ary.length; i++) {
    callback(i, ary[i])
  }
}

var compare = function(ary1, ary2){
  if (ary1.length !== ary2.length){
    throw new Error('不相等')
  }
  each(ary1, function(i, n){
    if (n !== ary2[ i ]){
      throw new Error('不相等')
    }
  });
  console.log('相等')
}
compare([1, 2, 3], [1, 2, 3])
compare([1, 2, 3], [1, 2, 4])
  • 外部迭代器

外部迭代器必须显式地请求迭代下一个元素

function Iterator(ary) {
  this.ary = ary
  this.index = 0
}

Iterator.prototype.isDone = function () {
  return this.index >= this.ary.length
}

Iterator.prototype.next = function () {
  this.index++
}
Iterator.prototype.getCurrItem = function () {
  return this.ary[this.index]
}

function compare(iterator1, iterator2) {
  while (!iterator1.isDone() || !iterator2.isDone()) {
    if (iterator1.getCurrItem() !== iterator2.getCurrItem()) {
      return false
    }
    iterator1.next()
    iterator2.next()
  }
  return true
}

var a = new Iterator([1, 2, 3])
var b = new Iterator([1, 2, 3, 4])
var c = compare(a, b)
console.log(c)

另外还有迭代器的两种常见处理,倒序和中止

// 倒序
function reverseEach(ary, callback) {
  for(var i = ary.length - 1; i >= 0; i--) {
    callback(i, ary[i])
  }
}
reverseEach([3, 2, 1], function (i, n) {
  console.log(n) // 1 2 3
})
// 中止
function reverseEach(ary, callback) {
  for(var i = ary.length - 1; i >= 0; i--) {
    if(callback(i, ary[i]) === false) {
      break
    }
  }
}
reverseEach([3, 2, 1], function (i, n) {
  if(n > 2) {
    return false
  }
  console.log(n) // 1 2
})
Last Updated: 7/16/2020, 4:28:33 PM