Skip to content

如何使对象 iterable 化, 使其可以支持 for...of 迭代

Posted on:2024年8月14日 at 12:24

要使对象支持 for...of 迭代,你需要使该对象具有符合迭代协议的迭代器。实现这一点的方法是为对象定义一个名为 Symbol.iterator 的方法。这个方法应该返回一个迭代器对象,迭代器对象必须有一个 next 方法,该方法返回一个对象,其中包含 valuedone 属性。

以下是实现过程的步骤和示例代码:

1. 实现 Symbol.iterator 方法

1.1 定义迭代器对象

迭代器对象需要实现 next 方法,next 方法返回一个对象,包含两个属性:

1.2 在对象中实现 Symbol.iterator

Symbol.iterator 方法定义在对象上,这样对象就变成了可迭代的。

示例代码

示例 1: 基本对象

const myObject = {
  items: ["a", "b", "c"],
  [Symbol.iterator]() {
    let index = 0;
    const items = this.items;
    return {
      next() {
        if (index < items.length) {
          return { value: items[index++], done: false };
        } else {
          return { done: true };
        }
      },
    };
  },
};

// 使用 for...of 进行迭代
for (const item of myObject) {
  console.log(item); // 'a', 'b', 'c'
}

示例 2: 自定义对象

function createIterableObject() {
  return {
    start: 1,
    end: 5,
    [Symbol.iterator]() {
      let current = this.start;
      const end = this.end;
      return {
        next() {
          if (current <= end) {
            return { value: current++, done: false };
          } else {
            return { done: true };
          }
        },
      };
    },
  };
}

const iterableObject = createIterableObject();

// 使用 for...of 进行迭代
for (const num of iterableObject) {
  console.log(num); // 1, 2, 3, 4, 5
}

3. 注意事项

示例 3: 使用生成器

function* range(start, end) {
  for (let i = start; i <= end; i++) {
    yield i;
  }
}

const iterableObject = range(1, 5);

// 使用 for...of 进行迭代
for (const num of iterableObject) {
  console.log(num); // 1, 2, 3, 4, 5
}
原文转自:https://fe.ecool.fun/topic/eca441f6-10bd-41e4-b154-a409d43ad44b