@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
}
  • Вопрос задан
  • 129 просмотров
Пригласить эксперта
Ответы на вопрос 2
0xD34F
@0xD34F Куратор тега JavaScript
Код, который работает некорректно...

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

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

Array.prototype[Symbol.iterator] = function() {
  ...
};

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

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

Войти через центр авторизации
Похожие вопросы