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

Как перейти на следующий элемент массива в JS?

Имеется массив из значений
Необходимо переходить на следующее значение этого массива
Как это сделать?
  • Вопрос задан
  • 2854 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
Seasle
@Seasle Куратор тега JavaScript
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
}

Но зачем?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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