编程 js迭代器

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

迭代器(一)

目录

  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 编程 数据结构

推荐文章

一个数字时钟的HTML
2024-11-19 07:46:53 +0800 CST
Vue3中如何处理路由和导航?
2024-11-18 16:56:14 +0800 CST
php内置函数除法取整和取余数
2024-11-19 10:11:51 +0800 CST
初学者的 Rust Web 开发指南
2024-11-18 10:51:35 +0800 CST
一个有趣的进度条
2024-11-19 09:56:04 +0800 CST
Rust 并发执行异步操作
2024-11-19 08:16:42 +0800 CST
Python上下文管理器:with语句
2024-11-19 06:25:31 +0800 CST
HTML和CSS创建的弹性菜单
2024-11-19 10:09:04 +0800 CST
Linux查看系统配置常用命令
2024-11-17 18:20:42 +0800 CST
Python中何时应该使用异常处理
2024-11-19 01:16:28 +0800 CST
Gin 与 Layui 分页 HTML 生成工具
2024-11-19 09:20:21 +0800 CST
一些高质量的Mac软件资源网站
2024-11-19 08:16:01 +0800 CST
一个简单的html卡片元素代码
2024-11-18 18:14:27 +0800 CST
如何在Vue中处理动态路由?
2024-11-19 06:09:50 +0800 CST
Elasticsearch 聚合和分析
2024-11-19 06:44:08 +0800 CST
25个实用的JavaScript单行代码片段
2024-11-18 04:59:49 +0800 CST
Vue3中的v-for指令有什么新特性?
2024-11-18 12:34:09 +0800 CST
liunx宝塔php7.3安装mongodb扩展
2024-11-17 11:56:14 +0800 CST
程序员茄子在线接单