什么是迭代
从一个数据集合中按照一定的顺序,不断取出数据的过程 , 听起来就像是遍历,但它与遍历是两种方式
迭代与遍历的区别
迭代强调的是依次取数据,并不保证取多少,也不保证把所有的数据取完,就像是从无限的数组中取下一位数据
遍历强调的是要把整个数据依次全部取出,使用遍历肯定确定啦数组的索引值是有限的
迭代:拿产品迭代举例,产品会经过不断的迭代来迎合市场,这说明这个产品下次到底是个什么样子的产品都是未知的,这都要看市场的需求就像是先做一个版本,再考虑下一个版本怎吗做,遍历的话就像是你已经提前知道啦所有一样,只需要将整个做出来依次发布出去
迭代器
对迭代过程的封装,在不同的语言中有不同的表现形式,通常为对象
迭代模式
一种设计模式,用于统一迭代过程,并规范了迭代器规格:
- 迭代器应该具有得到下一个数据的能力
- 迭代器应该具有判断是否还有后续数据的能力
js中的迭代器
JS规定,如果一个对象具有next方法,并且该方法返回一个对象,该对象的格式如下:
const iterator = {next() {return {valur: 值,done: 判断是否还有后续数据的能力,}}}
则认为该对象是一个迭代器
含义:
- next方法:用于得到下一个数据
- 返回的对象
- value:下一个数据的值
- done:boolean,是否迭代完成
案例
1:
const arr = [1, 2, 3, 4, 5];//迭代数组arrconst 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 creatorfunction 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();
