编程 js迭代器

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

迭代器(一)

目录

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

推荐文章

如何开发易支付插件功能
2024-11-19 08:36:25 +0800 CST
PHP 微信红包算法
2024-11-17 22:45:34 +0800 CST
Vue3中的事件处理方式有何变化?
2024-11-17 17:10:29 +0800 CST
Vue3中的v-for指令有什么新特性?
2024-11-18 12:34:09 +0800 CST
FcDesigner:低代码表单设计平台
2024-11-19 03:50:18 +0800 CST
JavaScript中的常用浏览器API
2024-11-18 23:23:16 +0800 CST
用 Rust 玩转 Google Sheets API
2024-11-19 02:36:20 +0800 CST
使用 sync.Pool 优化 Go 程序性能
2024-11-19 05:56:51 +0800 CST
mysql时间对比
2024-11-18 14:35:19 +0800 CST
Vue中的异步更新是如何实现的?
2024-11-18 19:24:29 +0800 CST
赚点点任务系统
2024-11-19 02:17:29 +0800 CST
Golang在整洁架构中优雅使用事务
2024-11-18 19:26:04 +0800 CST
thinkphp分页扩展
2024-11-18 10:18:09 +0800 CST
微信小程序热更新
2024-11-18 15:08:49 +0800 CST
PHP 唯一卡号生成
2024-11-18 21:24:12 +0800 CST
小技巧vscode去除空格方法
2024-11-17 05:00:30 +0800 CST
程序员茄子在线接单