迭代原理
要想学好迭代器,就得将迭代先了解搞懂
从一个数据集合当中按一定的顺序,不断取出数据(不能确定数据的多少)的过程就称之为迭代
迭代与遍历的区别
迭代:强调是依次取出,不能确定取出的数据有多少,也不能去保证可以将数据全部的取出
举个例子:就比如,你做一个产品时,也不知道产品最后呈现的样子,只能等做出来了,看客户有什么不满意的地方,再进行改进
遍历:强调已知数据的多少,可循环出所有数据
迭代器
迭代器就是对迭代的过程进行了封装,通常为对象。
迭代器和生成器主要用于react框架中
是否为迭代器的条件:
判断是否有得到下一个数据的能力
判断是否有后续数据的能力
迭代模式
一种设计模式,用于同一迭代的过程,并且规范迭代器的规格
在js中规定,如果一个对象有next()
,并且返回一个对象,就称之为这个对象为迭代器
const obj = {
next() { //得到下一个数据
return {
value : 1, //数据,数量一般都是未知
done : false, //判断是否有后续数据,一般为Boolean类型,为false时迭代还没完成,为true时,就是迭代已经完成,后续没有数据了
}
}
}
Iterator作用
- 为各种数据结构,提供一个统一的、简便的访问接口;
- 使得数据结构的成员能够按某种次序排列
- Iterator可用遍历命令
for...of
循环,只能循环一个可以迭代的对象,像Array,函数的 arguments 对象、set容器、map容器、String、都可以用for of
遍历
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 ++; //如果数据存在,返回当前数据的并将当前数据位置的标识递增+1
return result; //返回数据
}
}
console.log(iterator) //当前这个对象就为迭代器
console.log(iterator.next()) //取数据
//让迭代器自己取数据,直到没有数据为止
let data = iterator.next();
while(!data.done){ // 没有数据时
console.log(data.value)
data = iterator.next();
}
console.log("迭代完成")
创建迭代器的函数
//创建迭代器的函数
function createIterator(arr){
let i = 0;
return {
next(){
let result = {
value : arr[i],
done : i >= arr.length
}
i ++;
return result;
}
}
}
const iter = createIterator(arr)
可迭代对象
ES6中,如果对象具有知名符号的属性Symbol.interator
,就表示该对象可以迭代
ES6及之后,数组及类数组就可以直接创建可迭代对象
展开运算符(...
)可用于迭代对象,迭代对象的内容可直接添加到数组当中去
创建斐波那契数列迭代器
function FeiboInderator() {
let arr = [0, 1]
let i = 1;
return {
next() {
if (arr[i] === undefined) {
arr.push(arr[i - 1] + arr[i - 2])
}
let val = arr[i]
i++
return val
}
}
}
const iter = FeiboInderator();