第一种实现方式(Generator语法糖)
介绍
- 使用
Generator
语法糖实现 - 语法糖中的循环只会执行一次
代码实现
// 创建数组[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(), '--')