第七章-迭代器模式
cooljser 2020-07-01
定义:迭代器模式是指一种方法顺序方位一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的某个元素。
# Jquery 中的迭代器
$.each([1, 2, 3], function(i, n) {
console.log('当前下标为:', i);
console.log('当前值为:', n);
});
1
2
3
4
2
3
4
# 自己实现一个迭代器
我们来自己实现一个 each 函数,each 函数接受 2 个参数,第一个参数为被循环的数组,第二个参数为循环中的回调函数。
var each = function(arr, cb) {
for (var i = 0; i < arr.length; i++) {
cb.call(arr[i], i, arr[i]);
}
}
each([1, 2, 3], function(i, n) {
console.log(i, n)
})
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 内部迭代器和外部迭代器
# 内部迭代器
定义:函数内部已经定义好了迭代规则,它会完全接手整个迭代过程,外部只需要一次初识调用即可。但是如果我们需要判断 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 不相等');
}
});
console.log('ary1 和 ary2 相等');
};
compare([1, 2], [1, 2]);
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
虽然上面的代码实现了我们需要的功能,但是一点都不优雅,下面我们来看看使用外部迭代器如何实现
# 外部迭代器
外部迭代器必须显示的请求迭代下一个元素,比如 generator、yield 之类的。我们先来实现一个简单的 Iterator:
var Iterator = function (obj) {
var current = 0;
var next = function () {
current += 1;
};
var isDone = function () {
return current >= obj.length;
};
var getCurrItem = function () {
return obj[current];
};
return {
next,
isDone,
getCurrItem,
};
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
然后我们再利用这个 Iterator 来实现一个 compare 函数
var compare = function (iterator1, iterator2) {
while (!iterator1.isDone() || !iterator2.isDone()) {
if (iterator1.getCurrItem() !== iterator2.getCurrItem()) {
throw new Error('iterator1 和 iterator2 不相等');
}
iterator1.next();
iterator2.next();
}
console.log('iterator1 和 iterator2 相等');
};
var iterator1 = Iterator([1, 2, 3]);
var iterator2 = Iterator([1, 2]);
compare(iterator1, iterator2); // 不相等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
外部迭代器的调用方式虽然会复制一点,但是它的适用面会更广,也能满足更多变的需求。内部迭代器和外部迭代器在实际生产中没有优劣之分,根据场景选择一个合适的方式就好了。
# 迭代器模式的应用举例
略