迭代器

# 迭代器

# 什么是迭代

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

# 迭代和遍历的区别

迭代强调的是依次取数据,并不保证取多少,也不保证把所有的数据取完。 遍历强调的是把整个数据依次全部取出。

比如有一个数组 arr=[1,2,3,4,5,6] 遍历就是将数组arr的数据按照顺序从头到尾依次取一遍 迭代是从数组arr里面先取一个出来,然后我不知道要不要继续取下一个,也不知道这个数组到底有多大,针对的只是当前这一项,并不知道后面的情况。

# 迭代器

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

就是帮我们取数的工具。

# 迭代模式

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

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

# JS中的迭代器

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

 {value:"any-值",done:"Boolean-是否迭代完成"}

则认为该对象是一个迭代器。

含义:

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

# 使用迭代器获取数组中的值

  var arr = [1, 2, 3, 4, 5, 6]
  const Iterator = {
      index: 0,
      next() {
          const obj = {
              value: arr[this.index],
              done: this.index >= arr.length
          }
          this.index++;
          return obj
      }
  }

  console.log(Iterator.next());
  console.log(Iterator.next());
  console.log(Iterator.next());
  console.log(Iterator.next());
  console.log(Iterator.next());
  console.log(Iterator.next());
  console.log(Iterator.next());

# 迭代器生成

  function createIterator(arr) {
      return {
          index: 0,
          next() {
              const obj = {
                  value: arr[this.index],
                  done: this.index >= arr.length
              }
              this.index++;
              return obj
          }
      }
  }

# 可迭代协议

ES6规定,如果一个对象具有知名符号属性Symbol.iterator,并且属性值是一个迭代器创建函数,则该对象是可迭代的(iterable)

也就是说官方替我们实现了一个迭代器接口,我们可以通过这个接口拿到默认跌倒器,也能实现一个我们自己的迭代器

 var arr = [1, 2, 3, 4, 5, 6]
 
 const it = arr[Symbol.iterator]();

 console.log(it.next())
 console.log(it.next())
 console.log(it.next())
 console.log(it.next())
 console.log(it.next())
arr[Symbol.iterator] = function () {
    let index = this.length - 1;
    let _this = this;
    return {
        next() {
            const obj = {
                value: _this[index],
                done: index < 0
            }
            index--;
            return obj
        }
    }
};

const it = arr[Symbol.iterator]();

console.log(it.next())
console.log(it.next())
console.log(it.next())
console.log(it.next())
console.log(it.next())
console.log(it.next())
console.log(it.next())