背景知识
什么是迭代?
从一个数据集合中按照一定的顺序,不断取出数据的过程。
迭代和遍历的区别?
迭代强调的是依次取数据,并不保证取多少,也不保证把所有数据取完;
遍历强调的是把整个数据依次全部取出。
举例:产品迭代 产品随着市场变化,但市场最终变成什么样不知道,但可以先做个初版。
迭代器
对迭代过程的封装,在不同的语言中有不同的表现形式,通常为对象。
作用:帮助你拿数据
迭代模式
一种设计模式,用于统一迭代过程,并规范了迭代器规格:
- 迭代器应该具有得到下一个数据的能力;
- 迭代器应该具有判断是否还有后续数据的能力
JS中的迭代器
JS规定,如果一个对象具有next方法,并且该方法返回一个对象,该对象的格式为:
{value: 值, done: 是否迭代完成},则,认为该对象是一个迭代器。
完整格式:obj为迭代器
const obj = {
next() {
return {
value: xxx,
done: xxx
}
}
}
以上代码的含义:
- next方法:用于得到下一个数据
- 返回的对象
-
value:下一个数据的值
-
done:boolean,是否迭代完成(后面没有数据表示数据已经取完了)
-
举例:迭代数组
const arr = [1, 2, 3, 4, 5];
// 迭代数组arr(要保证每一次调用next取下一项,因此可以添加一个属性i)
const iterator = {
i: 0, // 当前的数组下标
next() {
var result = {
value: arr[this.i],
done: this.i >= arr.length // 下标越界,表示数据取完
}
this.i++;
return result;
}
}
// 如何取数据?
iterator.next(); // {value: 1,done: false}
好处:后续的操作不需要关注arr,只需关注迭代器(iterator)。
想迭代几次就调用几次next方法, 很灵活。
进阶版:让迭代器不断的取出下一个数据,直到没有数据为止。
let data = iterator.next();
while (!data.done) { // 没有迭代完成,取出数据
console.log(data.value);
// 进行下一次迭代
data = iterator.next();
}
console.log('迭代完成'); // 1 2 3 4 5 迭代完成
升华版:通过函数创建迭代器
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);