迭代器
背景知识
-
什么是迭代? 从一个数据集合中按照一定的顺序,不断取出数据的过程
-
迭代和遍历的区别? 迭代强调的是依次取数据,并不保证取多少,也不保证把所有的数据取完 遍历强调的是要把整个数据依次取出
-
迭代器 对迭代过程的封装,在不同的语言中有不同的表现形式,通常为对象
-
迭代模式 一种设计模式,用于统一迭代的过程,并规范了迭代器规格:
- 迭代器应该具有得到下一个数据的能力
- 迭代器应该具有判断是否还有后续数据的能力
JS中的迭代器
js规定,如果一个对象具有next的方法,并且返回一个对象,对象的格式如下:
{ value: [值],done: 是否迭代完成 }
const obj = {
next() {
return {
value: xxx,
done: xxx
}
}
}
则认为该对象是个可迭代器 含义:
- next方法: 用于得到下一个数据
- 返回的对象:
- value: 下一个数据的值
- done:boolean -> 表示是否迭代完成
遍历和迭代的对比
const arr = [1, 2, 3, 4];
for (let i = 0; i < arr.length; i++) {
const element = arr[i];
}
const iterator = {
i: 0,//当前数组下标
next() {
let result = {
value: arr[this.i],
done: this.i === arr.length - 1
}
this.i++;
return result
}
}
let data = iterator.next()
// iterator.next()
// iterator.next()
// iterator.next()
// iterator.next()
让迭代器不断的取出下一个数据,直到没有数据为止
while(!data.done) {
// 只要没有迭代完成,则取出数据
console.log(data.value);
// 进行下一次迭代
data = iterator.next();
}
console.log("完成迭代")
补充: 写迭代器的时候很恶心,用的时候很爽
手写迭代器生成函数手写
const arr1 = [1, 2, 3, 4];
const arr2 = [6, 7, 8, 9];
// 迭代器创建函数
function createIterator(arr) {
let i = 0;//当前数组下标
return {
next() {
let result = {
value: arr[i],
done: i === arr.length - 1
}
i++;
console.log(result)
return result
}
}
}
const iter1 = createIterator(arr1);
iter1.next()
iter1.next()
iter1.next()
iter1.next()
const iter2 = createIterator(arr2);
iter2.next()
iter2.next()
iter2.next()
iter2.next()
依次得到斐波拉契数列前面n位的值
// 依次得到斐波拉契数列前面n位的值
// 创建一个斐波拉契数列的迭代器
function createFbIterator() {
let prev1 = 1, prev2 = 1;//当前位置的值
let n = 1;//当前是第几位
return {
next() {
let value = n <= 2 ? 1 : prev1 + prev2;
const result = {
value,
done: false
}
prev2 = prev1;
prev1 = result.value;
n++;
console.log(result);
return result;
}
}
}
const iterFb = createFbIterator();
iterFb.next();
iterFb.next();
iterFb.next();
iterFb.next();
iterFb.next();
实现的方式多种多样,最后返回的格式是一致的