什么是迭代

从一个数据集合中按照一定的顺序,不断取出数据的过程 , 听起来就像是遍历,但它与遍历是两种方式

迭代与遍历的区别

迭代强调的是依次取数据,并不保证取多少,也不保证把所有的数据取完,就像是从无限的数组中取下一位数据
遍历强调的是要把整个数据依次全部取出,使用遍历肯定确定啦数组的索引值是有限的
迭代:拿产品迭代举例,产品会经过不断的迭代来迎合市场,这说明这个产品下次到底是个什么样子的产品都是未知的,这都要看市场的需求就像是先做一个版本,再考虑下一个版本怎吗做,遍历的话就像是你已经提前知道啦所有一样,只需要将整个做出来依次发布出去

迭代器

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

迭代模式

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

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

js中的迭代器

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

  1. const iterator = {
  2. next() {
  3. return {
  4. valur: 值,
  5. done: 判断是否还有后续数据的能力,
  6. }
  7. }
  8. }

则认为该对象是一个迭代器
含义:
- next方法:用于得到下一个数据
- 返回的对象
- value:下一个数据的值
- done:boolean,是否迭代完成

案例

1:

  1. const arr = [1, 2, 3, 4, 5];
  2. //迭代数组arr
  3. const iterator = {
  4. i: 0, //当前的数组下标
  5. next() {
  6. var result = {
  7. value: arr[this.i],
  8. done: this.i >= arr.length
  9. }
  10. this.i++;
  11. return result;
  12. }
  13. }
  14. //让迭代器不断的取出下一个数据,直到没有数据为止
  15. let data = iterator.next();
  16. while (!data.done) { //只要没有迭代完成,则取出数据
  17. console.log(data.value)
  18. //进行下一次迭代
  19. data = iterator.next();
  20. }
  21. console.log("迭代完成")

2:

  1. const arr1 = [1, 2, 3, 4, 5];
  2. const arr2 = [6, 7, 8, 9];
  3. // 迭代器创建函数 iterator creator
  4. function createIterator(arr) {
  5. let i = 0;//当前的数组下标
  6. return {
  7. next() {
  8. var result = {
  9. value: arr[i],
  10. done: i >= arr.length
  11. }
  12. i++;
  13. return result;
  14. }
  15. }
  16. }
  17. const iter1 = createIterator(arr1);
  18. const iter2 = createIterator(arr2);

3:

  1. // 依次得到斐波拉契数列前面n位的值
  2. // 1 1 2 3 5 8 13 .....
  3. //创建一个斐波拉契数列的迭代器
  4. function createFeiboIterator() {
  5. let prev1 = 1,
  6. prev2 = 1, //当前位置的前1位和前2位
  7. n = 1; //当前是第几位
  8. return {
  9. next() {
  10. let value;
  11. if (n <= 2) {
  12. value = 1;
  13. } else {
  14. value = prev1 + prev2;
  15. }
  16. const result = {
  17. value,
  18. done: false
  19. };
  20. prev2 = prev1;
  21. prev1 = result.value;
  22. n++;
  23. return result;
  24. }
  25. }
  26. }
  27. const iterator = createFeiboIterator();