1.背景知识
1)迭代的定义:从一个数据集合中按照一定的顺序,不断取出数据的过程称为迭代
2)迭代和遍历的区别
迭代:迭代强调的是依次取数据的过程,并不保证取多少,也不保证把所有的数据都取完
遍历:遍历强调的是要把整个数据依次全部取出
3)迭代器:对迭代过程的封装,在不同的语言中有不同的表现形式,通常为对象
4)迭代模式:一种设计模式,用于统一迭代过程,迭代模式规范了迭代器规格
- 迭代器应该具有得到下一个数据的能力
- 迭代器应该具有判断是否还有后续数据的能力
2.JS中的迭代器
JS规定,如果一个对象具有next方法,并且该方法返回一个对象,该对象的格式如例【例2】,则认为该对象是一个迭代器
含义
next方法:用于得到下一个数据
返回的对象:value——下一个数据的值;done——boolean,是否迭代完成
【例】数组的迭代
const arr = [1, 2, 3, 4, 5];
//迭代数组
const iterator = {
i: 0,
next() {
var result = {
value: arr[this.i],
done: this.i >= arr.length
}
this.i++
return result;
}
}
let data = iterator.next();
console.log(data);
while (!data.done) {
console.log(data.value);
//进行下一次迭代
data = iterator.next();
console.log(data)
}
console.log('迭代完成');
【例2】迭代器创建函数
const arr1 = [12, 43, 6534, 1235, 6734];
const arr2 = [123, 56, 876, 312, 957];
//迭代器创建函数
function creatIterator(arr) {
let i = 0;
return {
next() {
var result = {
value: arr[i],
done: i >= arr.length
}
i++;
return result;
}
}
}
const iter1 = creatIterator(arr1);
const iter2 = creatIterator(arr2);
console.log(iter1);
【例3】斐波拉契数列
//1 1 2 3 5 8 13 ……
function getFeiboIterator() {
let prev1 = 1,
prev2 = 1,
n = 1;
return {
next() {
let value;
//前两位为1
if (n <= 2) {
value = 1;
} else {
//从第三位开始,值为其前两位的和
value = prev1 + prev2;
}
const result = {
value,
done: false
};
//flag右移,即需要更新前两位的值
prev2 = prev1;
prev1 = result.value;
n++;
return result;
}
}
}
feibo = getFeiboIterator();
【结果】