Как сделать объект итерируемым

Ответ

Чтобы сделать объект итерируемым, нужно реализовать метод [Symbol.iterator](), который возвращает итератор. Итератор — это объект с методом next(), возвращающим объект вида {value, done}.

Пример:

const myIterable = {
  from: 1,
  to: 5,

  [Symbol.iterator]() {
    let current = this.from;
    const last = this.to;

    return {
      next() {
        if (current <= last) {
          return { value: current++, done: false };
        }
        return { done: true };
      }
    };
  }
};

for (const num of myIterable) {
  console.log(num); // 1, 2, 3, 4, 5
}

Ключевые моменты:

  1. Метод [Symbol.iterator] должен возвращать объект-итератор
  2. Итератор должен иметь метод next()
  3. next() возвращает {value, done} до завершения итерации

Ответ 18+ 🔞

Да ты посмотри, что творят, блядь! Чтобы твою какую-то хрень можно было циклом for..of прогонять, как нормальный массив, надо ей внутрь воткнуть один специальный метод. Символ такой, [Symbol.iterator](), ёпта!

Суть в чём, блядь? Этот метод должен вернуть тебе объект-итератор. А итератор — это не абы что, это объект, у которого есть метод next(). И этот next() каждый раз, когда его дергают, выплёвывает результат: {value: твое_значение, done: false}. А когда всё кончилось, он говорит {done: true}. Всё, пиздец, итерация закончена.

Смотри, вот тебе живой пример, как это выглядит. Код не трогаю, он святой, блядь:

const myIterable = {
  from: 1,
  to: 5,

  [Symbol.iterator]() {
    let current = this.from;
    const last = this.to;

    return {
      next() {
        if (current <= last) {
          return { value: current++, done: false };
        }
        return { done: true };
      }
    };
  }
};

for (const num of myIterable) {
  console.log(num); // 1, 2, 3, 4, 5
}

Видишь, что происходит, хитрая жопа? Создали объект myIterable с полями from и to. Внутри метода [Symbol.iterator]() замыкаем текущее значение и последнее. А потом возвращаем объектик с методом next(), который эти значения и выдаёт, пока не перевалит за to. И после этого наш for..of начинает это дело жрать, как будто так и надо!

Запомни три кита, блядь:

  1. Метод [Symbol.iterator]() — он должен быть. Без него нихуя не получится.
  2. Он возвращает объект-итератор.
  3. У этого итератора есть метод next(), который и кормит всех данными, пока не кончится.

Вот и вся магия, ёбана! Не так страшен чёрт, как его малюют. Главное — начать, а там уже итерация покатится, как по маслу.