什么是迭代
从一个数据集合中按照一定的顺序,不断取出数据的过程 , 听起来就像是遍历,但它与遍历是两种方式
迭代与遍历的区别
迭代强调的是依次取数据,并不保证取多少,也不保证把所有的数据取完,就像是从无限的数组中取下一位数据
遍历强调的是要把整个数据依次全部取出,使用遍历肯定确定啦数组的索引值是有限的
迭代:拿产品迭代举例,产品会经过不断的迭代来迎合市场,这说明这个产品下次到底是个什么样子的产品都是未知的,这都要看市场的需求就像是先做一个版本,再考虑下一个版本怎吗做,遍历的话就像是你已经提前知道啦所有一样,只需要将整个做出来依次发布出去
迭代器
对迭代过程的封装,在不同的语言中有不同的表现形式,通常为对象
迭代模式
一种设计模式,用于统一迭代过程,并规范了迭代器规格:
- 迭代器应该具有得到下一个数据的能力
- 迭代器应该具有判断是否还有后续数据的能力
js中的迭代器
JS规定,如果一个对象具有next方法,并且该方法返回一个对象,该对象的格式如下:
const iterator = {
next() {
return {
valur: 值,
done: 判断是否还有后续数据的能力,
}
}
}
则认为该对象是一个迭代器
含义:
- next方法:用于得到下一个数据
- 返回的对象
- value:下一个数据的值
- done:boolean,是否迭代完成
案例
1:
const arr = [1, 2, 3, 4, 5];
//迭代数组arr
const iterator = {
i: 0, //当前的数组下标
next() {
var result = {
value: arr[this.i],
done: this.i >= arr.length
}
this.i++;
return result;
}
}
//让迭代器不断的取出下一个数据,直到没有数据为止
let data = iterator.next();
while (!data.done) { //只要没有迭代完成,则取出数据
console.log(data.value)
//进行下一次迭代
data = iterator.next();
}
console.log("迭代完成")
2:
const arr1 = [1, 2, 3, 4, 5];
const arr2 = [6, 7, 8, 9];
// 迭代器创建函数 iterator creator
function createIterator(arr) {
let i = 0;//当前的数组下标
return {
next() {
var result = {
value: arr[i],
done: i >= arr.length
}
i++;
return result;
}
}
}
const iter1 = createIterator(arr1);
const iter2 = createIterator(arr2);
3:
// 依次得到斐波拉契数列前面n位的值
// 1 1 2 3 5 8 13 .....
//创建一个斐波拉契数列的迭代器
function createFeiboIterator() {
let prev1 = 1,
prev2 = 1, //当前位置的前1位和前2位
n = 1; //当前是第几位
return {
next() {
let value;
if (n <= 2) {
value = 1;
} else {
value = prev1 + prev2;
}
const result = {
value,
done: false
};
prev2 = prev1;
prev1 = result.value;
n++;
return result;
}
}
}
const iterator = createFeiboIterator();