编程 js迭代器

2024-11-19 07:49:47 +0800 CST views 693

迭代器(一)

目录

  1. 简介
  2. 自定义一个简单迭代器

简介

迭代器是一个对象,它定义了一个序列,并在终止时附带一个返回值。迭代器的作用是为不同的数据结构提供统一的遍历访问机制,使数据结构中的元素能够按顺序依次被遍历(如 for...of 语法)。

任何实现了 next() 方法并符合迭代器协议的对象都可以称为迭代器。next() 方法返回一个对象,该对象包含两个属性:

  • value: 迭代序列的下一个值;
  • done: 一个布尔值,表示是否已迭代到序列的最后一个值。

当迭代器被创建后,可以通过调用 .next() 显式地迭代。最后一次 .next() 调用返回 done: true,表明迭代结束。


自定义一个简单迭代器

以下代码实现了一个从 startend 的计数迭代器,最终返回值为 end

const testIterator = (start = 1, end = 5) => {
  let count = start - 1;
  const result = {
    next() {
      if (count < end) {
        count++;
        return { value: count, done: count === end };
      } else {
        return { value: count, done: true };
      }
    }
  };
  return result;
};

const customItertor = testIterator();
for (const index of Array(7)) {
  console.log(customItertor.next());
}

输出

{ value: 1, done: false }
{ value: 2, done: false }
{ value: 3, done: false }
{ value: 4, done: false }
{ value: 5, done: true }
{ value: 5, done: true }
{ value: 5, done: true }

迭代器(二)

目录

  1. 遍历原理解析
  2. 将原生对象改造为可迭代对象

遍历原理解析

迭代器为不同的数据结构提供了统一的访问机制,只要数据结构具备 iterator 接口,便可使用 for...of 遍历其所有成员。

例如,ArrayMapSetString 等都可以使用 for...of 遍历:

const arr = [1, 2, 3, 4, 5];
for (const item of arr) {
  console.log('item:', item);
}

输出

item: 1
item: 2
item: 3
item: 4
item: 5

通过 Symbol.iterator,可以看到数组内部已经实现了 iterator,保证了数组按序遍历。for...of 实际是通过迭代器的 next() 方法来逐步移动指针,依次输出每个元素,直到遍历完成。


将原生对象改造为可迭代对象

原生对象并不支持 for...of 遍历。我们可以通过实现 iterator 接口,将不可遍历的对象改造为可遍历对象。

const obj = {
  key1: 'value-1',
  key2: 'value-2',
  key3: 'value-3'
};

for (const value of obj) {
  console.log('value:', value);
}

输出(不支持遍历):

TypeError: obj is not iterable

改造为可迭代对象

通过自定义 Symbol.iterator,将对象改造成可遍历对象:

const obj = {
  key1: 'value-1',
  key2: 'value-2',
  key3: 'value-3',
  [Symbol.iterator]: function() {
    const self = this;
    const keys = Object.keys(self);
    let curKeyIndex = -1;

    const result = {
      next() {
        if (curKeyIndex < keys.length - 1) {
          curKeyIndex++;
          return { value: self[keys[curKeyIndex]], done: false };
        }
        return { value: undefined, done: true };
      }
    };

    return result;
  }
};

for (const value of obj) {
  console.log('value:', value);
}

输出

value: value-1
value: value-2
value: value-3

注意:Symbol.iterator 是一个预定义的 Symbol 类型值,用于定义默认的迭代行为。


复制全文 生成海报 JavaScript 编程 数据结构

推荐文章

JavaScript设计模式:组合模式
2024-11-18 11:14:46 +0800 CST
ElasticSearch集群搭建指南
2024-11-19 02:31:21 +0800 CST
PostgreSQL日常运维命令总结分享
2024-11-18 06:58:22 +0800 CST
Vue3中怎样处理组件引用?
2024-11-18 23:17:15 +0800 CST
H5保险购买与投诉意见
2024-11-19 03:48:35 +0800 CST
如何在Vue 3中使用Ref访问DOM元素
2024-11-17 04:22:38 +0800 CST
JavaScript设计模式:观察者模式
2024-11-19 05:37:50 +0800 CST
Vue3中如何实现状态管理?
2024-11-19 09:40:30 +0800 CST
JavaScript 上传文件的几种方式
2024-11-18 21:11:59 +0800 CST
html夫妻约定
2024-11-19 01:24:21 +0800 CST
Elasticsearch 聚合和分析
2024-11-19 06:44:08 +0800 CST
thinkphp分页扩展
2024-11-18 10:18:09 +0800 CST
api接口怎么对接
2024-11-19 09:42:47 +0800 CST
快手小程序商城系统
2024-11-25 13:39:46 +0800 CST
php机器学习神经网络库
2024-11-19 09:03:47 +0800 CST
LLM驱动的强大网络爬虫工具
2024-11-19 07:37:07 +0800 CST
程序员茄子在线接单