function* iterateArray(array) {
for (const entry of array) {
yield entry;
}
}
const numbers = [2, 4, 6, 8, 10];
const iterator = iterateArray(numbers);
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 4, done: false }
console.log(iterator.next()); // { value: 6, done: false }
// Дополнение
const adapter = iterator => () => {
const entry = iterator.next();
return entry.value;
};
const next = adapter(iterator);
console.log(next()); // 2
console.log(next()); // 4
console.log(next()); // 6
Версия без генератора:
const iterator = array => {
let index = 0;
return () => {
const value = array[index];
if (index < array.length) {
index++;
}
return value;
};
}
const numbers = [2, 4, 6, 8, 10];
const next = iterator(numbers);
console.log(next()); // 2
console.log(next()); // 4
console.log(next()); // 6
Я бы настаивал на версии с генератором, т. к. используя его, можно всегда узнать когда массив закончился. Оба варианта возвращают
undefined
как обозначение об окончании массива. Следовательно, во втором варианте можно проверять на
undefined
и если получаем
true
, значит проитерировали весь массив. Но что если
undefined
будет значением массива? В этом случае генераторы всю работу делают за нас, т. к. дополнительно отдают флаг, который говорит о завершении. Конечно, можно в варианте без генератора также симулировать данное поведение, возвращая следующую структуру:
{
value,
done: array.length === index
}
Но зачем?