Как получить следующий элемент из массива внутри цикла while в JavaScript
Что проверяют
Вопрос простой, поэтому смотрят на аккуратность: границы массива, undefined на последнем шаге, понимание, что индекс вы ведёте сами. Следом могут попросить то же самое без индекса, через итератор, или обход по кругу.
Как отвечать
Базовый вариант с индексом:
- цикл:
let i = 0; while (i < arr.length) { const cur = arr[i]; const next = arr[i + 1]; i++; }; - граница: на последней итерации
arr[i + 1]вернётundefined, исключения не будет. Если нужна пара соседей, условие циклаi < arr.length - 1или явная проверкаi + 1 < arr.length; undefinedкак значение: если в массиве могут лежатьundefined, по значению конец не определить, проверяйте индекс;- по кругу:
arr[(i + 1) % arr.length], так после последнего элемента идёт первый. Для отрицательных индексов удобенarr.at(-1), метод есть с ES2022.
Вариант без индекса через протокол итератора: const it = arr[Symbol.iterator](), затем let r = it.next(); while (!r.done) { ...; r = it.next(); }. Метод next() возвращает объект { value, done }. Так же работают Map, Set, строки и генераторы, поэтому код не завязан на массив. Чтобы заглянуть вперёд, читают следующий результат заранее и держат его в переменной.
Хорошо закончить сравнением: для простого перебора for...of и методы массива читаются лучше, а while оправдан, когда шаг переменный, например вы пропускаете элементы или двигаете два указателя навстречу друг другу.
Где спотыкаются
Забывают инкремент или прячут его под условие, и вкладка зависает в бесконечном цикле.
Меняют массив внутри цикла через splice или push. Длина меняется на ходу, элементы пропускаются или обход не заканчивается.
Проверяют наличие следующего через if (next). Такая проверка ломается на 0, пустой строке и false, а дырка в разреженном массиве тоже даёт undefined.