# 迭代器模式

什么是

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。

# 核心思想

TIP

在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素

# 具体实现

JS 中数组的 map forEach 已经内置了迭代器

[1, 2, 3].forEach(function (item, index, arr) {
  console.log(item, index, arr);
});

不过对于对象的遍历,往往不能与数组一样使用同一的遍历代码,我们可以封装一下:

function each(obj, cb) {
  var value;

  if (Array.isArray(obj)) {
    for (var i = 0; i < obj.length; ++i) {
      value = cb.call(obj[i], i, obj[i]);

      if (value === false) {
        break;
      }
    }
  } else {
    for (var i in obj) {
      value = cb.call(obj[i], i, obj[i]);

      if (value === false) {
        break;
      }
    }
  }
}

each([1, 2, 3], function (index, value) {
  console.log(index, value);
});

each({ a: 1, b: 2 }, function (index, value) {
  console.log(index, value);
});

// 0 1
// 1 2
// 2 3
// a 1
// b 2

再来看一个例子——强行地使用迭代器,来了解一下迭代器也可以替换频繁的条件语句,虽然例子不太好,但在其他负责的分支判断情况下,也是值得考虑的:

function getManager() {
  var year = new Date().getFullYear();
  if (year <= 2000) {
    console.log("A");
  } else if (year >= 2100) {
    console.log("C");
  } else {
    console.log("B");
  }
}
getManager(); // B

将每个条件语句拆分出逻辑函数,放入迭代器中迭代

function year2000() {
  var year = new Date().getFullYear();

  if (year <= 2000) {
    console.log("A");
  }

  return false;
}
function year2100() {
  var year = new Date().getFullYear();

  if (year >= 2100) {
    console.log("C");
  }

  return false;
}
function year() {
  var year = new Date().getFullYear();

  if (year > 2000 && year < 2100) {
    console.log("B");
  }
  return false;
}
function iteratorYear() {
  for (var i = 0; i < arguments.length; ++i) {
    var ret = arguments[i]();

    if (ret !== false) {
      return ret;
    }
  }
}
var manager = iteratorYear(year2000, year2100, year); // B
上次更新时间: 6/8/2023, 9:23:17 PM

大厂最新技术学习分享群

大厂最新技术学习分享群

微信扫一扫进群,获取资料

X