Как досрочно выйти из метода map в JavaScript
Что проверяют
Понимаете ли вы, что map по определению проходит массив целиком и возвращает массив той же длины, и умеете ли подобрать правильный инструмент под задачу. Следом часто спрашивают, что делает return внутри колбэка и можно ли так же прервать forEach.
Как отвечать
Сначала прямой ответ: штатного способа нет. break внутри колбэка даёт SyntaxError, потому что это не цикл, а return лишь завершает текущий вызов колбэка. Прервать можно только исключением, но управлять потоком через throw плохая практика.
Дальше выбор по задаче:
- остановиться по условию:
for...ofсbreak, результат собирается вручную. Этот же вариант подходит для асинхронных шагов сawait; - найти первый подходящий элемент:
findилиfindIndex, они останавливаются на первом совпадении; - проверить условие:
someиeveryпрекращают проход, как только ответ ясен; - обработать только часть: сначала
sliceилиfilter, потомmap. Например,items.slice(0, items.findIndex(isStop)), но не забудьте про случай, когдаfindIndexвернул-1; - ленивая обработка: iterator helpers из ES2025,
arr.values().map(fn).take(5).toArray()вызоветfnтолько пять раз.
В React-коде это чаще всего выглядит как отбор перед рендером: list.filter(...).slice(0, 10).map(...) внутри JSX, а не попытка оборвать map на середине.
Где спотыкаются
Считают, что return в колбэке останавливает map. На деле он работает как continue, а на месте пропущенных элементов в результате оказывается undefined.
Предлагают обернуть map в try/catch и бросить исключение. Работает, но читать и отлаживать такой код тяжело, а уже посчитанная часть результата теряется.
Советуют мутировать исходный массив изнутри колбэка, например обнулить length. Длина результата фиксируется при старте, поэтому получится массив с дырами, а заодно испорчены чужие данные.