14-迭代器

104 阅读2分钟

迭代器

背景知识

  1. 什么是迭代? 从一个数据集合中按照一定的顺序,不断取出数据的过程

  2. 迭代和遍历的区别? 迭代强调的是依次取数据,并不保证取多少,也不保证把所有的数据取完 遍历强调的是要把整个数据依次取出

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

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

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

JS中的迭代器

js规定,如果一个对象具有next的方法,并且返回一个对象,对象的格式如下:

{ value: [值],done: 是否迭代完成 }
const obj = {
  next() {
    return {
      value: xxx,
      done: xxx
    }
  }
}

则认为该对象是个可迭代器 含义:

  • next方法: 用于得到下一个数据
  • 返回的对象:
    • value: 下一个数据的值
    • done:boolean -> 表示是否迭代完成

遍历和迭代的对比

const arr = [1, 2, 3, 4];
for (let i = 0; i < arr.length; i++) {
  const element = arr[i];
}

const iterator = {
  i: 0,//当前数组下标
  next() {
    let result = {
      value: arr[this.i],
      done: this.i === arr.length - 1
    }
    this.i++;
    return result
  }
}
let data = iterator.next()
// iterator.next()
// iterator.next()
// iterator.next()
// iterator.next()
让迭代器不断的取出下一个数据,直到没有数据为止
while(!data.done) {
  // 只要没有迭代完成,则取出数据
  console.log(data.value);
  // 进行下一次迭代
  data = iterator.next();
}
console.log("完成迭代")

image.png

补充: 写迭代器的时候很恶心,用的时候很爽

手写迭代器生成函数手写

const arr1 = [1, 2, 3, 4];
const arr2 = [6, 7, 8, 9];

// 迭代器创建函数
function createIterator(arr) {
  let i = 0;//当前数组下标
  return {
    next() {
      let result = {
        value: arr[i],
        done: i === arr.length - 1
      }
      i++;
      console.log(result)
      return result
    }
  }
}
const iter1 = createIterator(arr1);
iter1.next()
iter1.next()
iter1.next()
iter1.next()
const iter2 = createIterator(arr2);
iter2.next()
iter2.next()
iter2.next()
iter2.next()

image.png

依次得到斐波拉契数列前面n位的值

// 依次得到斐波拉契数列前面n位的值
// 创建一个斐波拉契数列的迭代器
function createFbIterator() {
  let prev1 = 1, prev2 = 1;//当前位置的值
  let n = 1;//当前是第几位
  return {
    next() {
      let value = n <= 2 ? 1 : prev1 + prev2;
      const result = {
        value,
        done: false
      }
      prev2 = prev1;
      prev1 = result.value;
      n++;
      console.log(result);
      return result;
    }
  }
}
const iterFb = createFbIterator();
iterFb.next();
iterFb.next();
iterFb.next();
iterFb.next();
iterFb.next();

image.png

实现的方式多种多样,最后返回的格式是一致的