ES6之迭代器
//迭代器
function createIterator(arr) {
let i = 0;
return {
next() {
const result = {
value: arr[i],
done: i >= arr.length
}
i++;
return result;
}
};
}
const arr1 = [1, 2, 3, 4, 5]
const arr2 = [6, 7, 8, 9, 10]
const iter1 = createIterator(arr1)
const iter2 = createIterator(arr2)
let data = iter1.next()
while (!data.done) {
console.log(data.value)
data = iter1.next()
}
console.log('迭代器结束')
迭代是只关注能否取出下一个,关注当前的状态,遍历是必须取出所有的元素。当我们无法确定仓库或数据集的所有元素,或者没有必要去一一得到时,这种一个一个不断取数据的迭代方式就会特别适合。
为了成为迭代器,里面必须有一个方法 next() 保证可以取出下一个,返回一个对象。这个对象里面必须有 value , done ,value 保证当前的数据值,done 是不能超出数据集的范围。
之后使用 while 不断循环 data.done ,一旦超出范围就会结束循环。
比如在斐波那契数列中使用迭代器就特别适合,因为这种数列是无限扩展,无法确定数列的全部元素。
function createFeiboIterator() {
let prev1 = 1, prev2 = 1, n = 1;//定义前一位,前两位,数列的第n位
return {
next() {
let value;//定义当前项
//前两项为1
if (n <= 2) {
value = 1;
} else {
value = prev1 + prev2;
}
const result = {
value,
done: false,//永远无法拿到最后一位
}
//前面两个数据往后移一位
prev2 = prev1;
prev1 = result.value;
n++;
return result;
}
}
}
斐波那契数列后一项等于前两项的值,然后在调用 next() 方法的时候前面两个数据往前面移一位,这样就可以不断取出元素。