什么是迭代器,JS如何实现迭代器

1.背景知识

1)迭代的定义:从一个数据集合中按照一定的顺序,不断取出数据的过程称为迭代

2)迭代和遍历的区别

迭代:迭代强调的是依次取数据的过程,并不保证取多少,也不保证把所有的数据都取完

遍历:遍历强调的是要把整个数据依次全部取出

3)迭代器:对迭代过程的封装,在不同的语言中有不同的表现形式,通常为对象

4)迭代模式:一种设计模式,用于统一迭代过程,迭代模式规范了迭代器规格

  • 迭代器应该具有得到下一个数据的能力
  • 迭代器应该具有判断是否还有后续数据的能力

2.JS中的迭代器

JS规定,如果一个对象具有next方法,并且该方法返回一个对象,该对象的格式如例【例2】,则认为该对象是一个迭代器

含义

next方法:用于得到下一个数据

返回的对象:value——下一个数据的值;done——boolean,是否迭代完成

【例】数组的迭代

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++
        return result;
    }
}
let data = iterator.next();
console.log(data);
while (!data.done) {
    console.log(data.value);
    //进行下一次迭代
    data = iterator.next();
    console.log(data)
}
console.log('迭代完成');

【例2】迭代器创建函数

const arr1 = [12, 43, 6534, 1235, 6734];
const arr2 = [123, 56, 876, 312, 957];
//迭代器创建函数
function creatIterator(arr) {
    let i = 0;
    return {
        next() {
            var result = {
                value: arr[i],
                done: i >= arr.length
            }
            i++;
            return result;
        }
    }
}
const iter1 = creatIterator(arr1);
const iter2 = creatIterator(arr2);
console.log(iter1);

【例3】斐波拉契数列

//1 1 2 3 5 8 13 ……
function getFeiboIterator() {
    let prev1 = 1,
        prev2 = 1,
        n = 1;
    return {
        next() {
            let value;
            //前两位为1
            if (n <= 2) {
                value = 1;
            } else {
                //从第三位开始,值为其前两位的和
                value = prev1 + prev2;
            }
            const result = {
                value,
                done: false
            };
            //flag右移,即需要更新前两位的值
            prev2 = prev1;
            prev1 = result.value;
            n++;
            return result;
        }
    }
}
feibo = getFeiboIterator();

【结果】

  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值