迭代器模式就是提供一种接口,用户可以按照某种顺序访问数据,但是不需要了解数据的内部表示和具体操作。
jquery中的each和对象遍历的for in都是一种迭代器模式,不过这种迭代模式有个不好的地方是,他是从第一个元素一直迭代到最后一个元素的,即使他提供了停下来的功能,下次迭代的时候。还是会从头开始迭代,所以说他是无记忆的,如果我们需要在一个循环之内和之外连续地按序访问某个数据集,那就需要一个有记忆功能的迭代器。
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
class Iterator {
constructor(data) {
this.data = data.getData();
this.position = 0;
}
hasNext() {
return this.position < this.data.length
}
next() {
if (this.hasNext()) {
return this.data[this.position++];
}
else {
return;
}
}
len() {
return this.data.length;
}
getPosition() {
return this.position;
}
InitPosition(position) {
this.position = 0;
}
// back(step) {
// this.position--;
// }
// go(step) {
// if(step!==undefined) {
// return (this.position+=step);
// }
// return this.position++;
// }
}
class Data {
constructor(data){
this.data = data;
}
getData() {
return this.data;
}
push(arg) {
Array.prototype.push.apply(this.data,arguments);
}
pop(){
Array.prototype.pop.apply(this.data);
}
}
var data = new Data([3,4,1,2,3]);
var iterator = new Iterator(data);
while(iterator.hasNext()) {
var result = iterator.next();
if(result==1){
break;
}
console.log(result,iterator.getPosition());
}
console.log(iterator.hasNext() && iterator.next())
</script>
</body>
</html>
如果我们在某个迭代中遇到某种情况就会跳出循环,然后在循环外的某个地方继续在原来的位置访问数据集,这时候记忆功能就比较重要,而且提供了一个initPosition函数初始化迭代器的位置,这样就可以从头开始继续迭代了。代码中把数据的增删等会影响数据集长度的操作放到数据类中,访问性的操作则放到迭代器类里。