迭代器和生成器-迭代器

125 阅读2分钟

背景知识

什么是迭代?

从一个数据集合中按照一定的顺序,不断取出数据的过程。

迭代和遍历的区别?

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

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

举例:产品迭代 产品随着市场变化,但市场最终变成什么样不知道,但可以先做个初版。

迭代器

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

作用:帮助你拿数据

迭代模式

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

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

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);