定义
迭代器模式无非就是循环访问聚合对象中的各个元素
迭代器又分内部迭代器和外部迭代器
在 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]));