【面试题】实现函数:arr =[1,2,3,4,5,6,7,8,9,10,11,12,13];从数组每次取出3个数 如:123 456 789 依次循环下去。(每调用一次函数取一次)

第一种实现方式(Generator语法糖)

介绍

  1. 使用Generator语法糖实现
  2. 语法糖中的循环只会执行一次

代码实现

		// 创建数组[1,2,3,4.....,100]
        const arrContent = new Array(100).fill('').map((v, i) => i + 1)
        // 使用 Generator 语法糖构建函数
        function* genSlice(arr) {
            // 正常循环,总长度为arr数组的长度,每次 i 递增三个
            for (let i = 0; i < arr.length; i += 3) {
                console.log(i)
                /**
                 * yield: 执行一次 next 方法则返回一次数据(yield)
                 * arr.slice: 截取数组以 索引i 开头的,以 (索引i + 3) 结尾的数据,简而言之就是截取三个数字
                 */
                 yield arr.slice(i, i + 3)
            }
        }
        // 创建一个 genSlice 的实例;传递需要分割的数组
        const res = genSlice(arrContent);
        // 以下只是为了做打印;你可以直接使用 console.log(res.next()) 试着打印看看
        for (let i = 0; i < Math.ceil(arrContent.length / 3) + 1; i++) {
            // 从res.next()中解构出 done 和 value 数据
            const { done, value } = res.next();
            /**
             * res.next().done: 实例 genSlice 函数执行 next() 方法一次,则执行一个 yield(返回),当执行了 next() 且没有 yield 返回了的时候则返回 true ,代表函数内 yield 执行完毕。
             * 得出结论:Generator实例执行完毕的时候 done 为 true ,未执行完毕则为 false 。
             */
             !done && console.log(value)
        }

忽略注释内容后

 		const arrContent = new Array(100).fill('').map((v, i) => i + 1)
        function* genSlice(arr) {
            for (let i = 0; i < arr.length; i += 3) yield arr.slice(i, i + 3)
        }
        const res = genSlice(arrContent);
        console.log(res.next().value);
        console.log(res.next().value);
        console.log(res.next().value);

效果展示

在这里插入图片描述

第二种实现方式(以类的形式实现)

        const arrContent = new Array(100).fill('').map((v, i) => i + 1)
        class ClassSlice {
            constructor(arr) {
                this.arr = arr;
                this.i = 0;
            }

            useIt() {
                const arr = this.arr.slice(this.i, this.i + 3)
                this.i += 3;
                return arr;
            }
        }
        const clSlice = new ClassSlice(arrContent)
        console.log(clSlice.useIt(), '--')
        console.log(clSlice.useIt(), '--')
        console.log(clSlice.useIt(), '--')

效果展示

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值