加载中...
JavaScript设计模式 -- 4.迭代器模式
发表于:2021-06-06 | 分类: 前端

定义

迭代器模式无非就是循环访问聚合对象中的各个元素

迭代器又分内部迭代器外部迭代器
在 js 中,就已经有对应的实现。

内部迭代器如,

Array.prototype.forEach(callback(currentValue [, index [, array]])[, thisArg])

它在函数内部就已经定义好了迭代规则,所有的迭代过程在内部完成,跟迭代器的交互也仅是一次初始调用。如,forEach函数接受一个 callback,这个 callback 能够获取到数组每一项,并执行 callback 中的逻辑。

const arr = [1, 2, 3, 4, 5];
arr.forEach((item) => console.log(item));

但是不能同时迭代两个数组。

比如,现在有个需求,需要对比两个数组里元素值是否完全相同,则需要通过下面的方式。

var compare = function (arr1, arr2) {
  var equal = true;
  if (arr1.length !== arr2.length) {
    equal = false;
    return equal;
  }

  arr1.forEach((item, i) => {
    if (item !== arr2[i] && equal) {
      equal = false;
    }
  });
  return equal;
};

compare([1, 2, 3], [1, 2, 4]);

再看外部迭代器

var Iterator = function (arr) {
  var current = 0;

  var next = function () {
    current += 1;
  };

  var isDone = function () {
    return current >= arr.length;
  };

  var getCurrentItem = function () {
    return arr[current];
  };

  return {
    next,
    isDone,
    getCurrentItem,
  };
};

function compare(iterator1, iterator2) {
  var isEqual = true;
  while (!iterator1.isDone() && !iterator2.isDone()) {
    if (iterator1.getCurrentItem() !== iterator2.getCurrentItem()) {
      isEqual = false;
      break;
    }
    iterator1.next();
    iterator2.next();
  }

  return isEqual;
}

compare(Iterator([1, 2, 3]), Iterator([1, 2, 3]));
上一篇:
生命周期
下一篇:
JavaScript设计模式 -- 5.发布订阅模式
本文目录
本文目录