Iterator(迭代器)

迭代器

什么是迭代器?

 ◼ 迭代器(iterator),使用户在容器对象(container,例如链表或数组)上遍访的对象,使用该接口无需关心对象的内部实现细节。
    其行为像数据库中的光标,迭代器最早出现在1974年设计的CLU编程语言中;
    在各种编程语言的实现中,迭代器的实现方式各不相同,但是基本都有迭代器,比如Java、Python等;
◼ 从迭代器的定义我们可以看出来,迭代器是帮助我们对某个数据结构进行遍历的对象。
◼ 在JavaScript中,迭代器也是一个具体的对象,这个对象需要符合迭代器协议(iterator protocol):
    迭代器协议定义了产生一系列值(无论是有限还是无限个)的标准方式;
    在JavaScript中这个标准就是一个特定的next方法;
◼ next方法有如下的要求:
    一个无参数或者一个参数的函数,返回一个应当拥有以下两个属性的对象:
    done(boolean)
      ✓ 如果迭代器可以产生序列中的下一个值,则为false。(这等价于没有指定done 这个属性。)
      ✓ 如果迭代器已将序列迭代完毕,则为true。这种情况下,value 是可选的,如果它依然存在,即为迭代结束之后的默认返回值。
    value
      ✓ 迭代器返回的任何JavaScript 值。done 为 true 时可省略。

为单独数组创建迭代器

  const names = ["abc","bbb","ccc"]
    // 迭代这个names要先创建一个迭代器
    let index = 0
    //给数组names创建一个迭代器(names的迭代器)
    const namesIterator={
      //1.必须有一个next方法
      next:function(){
      //next方法必须返回俩个属性
        if(index <names.length){
          return {
          done:false,//done可以是true/false--->完成所有迭代后done的值才为true默认是false
          value:names[index++]//value必须是具体值或者undefined
          }
        }
        else{
          return {
          done:true,//done可以是true/false--->完成所有迭代后done的值才为true默认是false
          value:undefined//value必须是具体值或者undefined
          }
        }
        }
      }
  const value1 = namesIterator.next()//return {done:false,value:"abc"}
  const value2 = namesIterator.next()//return {done:false,value:"bbb"}
  const value3 = namesIterator.next()//return {done:false,value:"ccc"}
  const value4 = namesIterator.next()//return {done:true,value:"undefined"}
  console.log(value1)
  console.log(value2)
  console.log(value3)
  console.log(value4)

为所有数组创建迭代器

  const names = ["aaa","bbb","ccc"]
  const nums = [111,222,333,444]
  // 封装函数
  function createArrayIterator(arr){
    let index = 0
    const Iterator = {
      next(){
        if (index < arr.length){
          return {done:false,value:arr[index++]}
        }else{
          return {done:true,value:undefined}
        }
      }
    }
    return Iterator
  }
  // 给names创建迭代器
  const namesIterator = createArrayIterator(names)
  console.log(namesIterator.next())
  console.log(namesIterator.next())
  console.log(namesIterator.next())
  console.log(namesIterator.next())
  const numsIterator = createArrayIterator(nums)
  console.log(numsIterator.next())
  console.log(numsIterator.next())
  console.log(numsIterator.next())
  console.log(numsIterator.next())
  console.log(numsIterator.next())
posted @ 2024-10-21 10:32  韩德才  阅读(45)  评论(0编辑  收藏  举报