Задать вопрос
@vladis26

Как написать итератор для вывода нечетных чисел используя [Symbol.iterator]?

Необходимо вывести нечетные числа не изменяя текущий код.

const arr = Object.freeze([0, 1, 2, 3, 4, 5, 6, 7, 8])

// code

for (item of arr) {
    console.log(item) // 1,3,5,7
}


Код, который работает некорректно, т.е. выводит все числа от 0 до 8:

const arr = Object.freeze([0, 1, 2, 3, 4, 5, 6, 7, 8])


arr[Symbol.iterator] = function () {
    let count = 0;
    const array = arr;
    const newArr = []

    for (let i = 0; i <= array.length; i++) {
        if (array[i] % 2 == 1) {
            newArr.push(array[i])
        }
    }
    return {
        next() {
            if (count <= newArr.length - 1) {
                return {
                    done: false,
                    value: newArr[count++]
                };
            } else {
                return {
                    done: true
                };
            }
        }
    }
};

for (item of arr) {
    console.log(item) // 1,3,5,7
}
  • Вопрос задан
  • 289 просмотров
Подписаться 1 Средний 2 комментария
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Код, который работает некорректно...

Всё работает так, как и должно. После Object.freeze назначить новое свойство уже не получится. Можно записать итератор в прототип массива (ну и после того, как он отработает, вернуть оригинальный итератор на место):

const originalIterator = Array.prototype[Symbol.iterator];

Array.prototype[Symbol.iterator] = function() {
  let i = -1;

  return {
    next: () => (i += 2) < arr.length
      ? { done: false, value: this[i] }
      : { done: true },
  };
};

setTimeout(() => Array.prototype[Symbol.iterator] = originalIterator, 0);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
Зачем в итераторе filter? Это убивает всю идею. Надо помнить индекс последнего найденного числа, и искать следующее прямо в функции next(), начиная от сохраненного
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы