Что должна возвращать функция any?
Что проверяют
Знаете ли вы, что в JavaScript под именем any живут две разные вещи: проверка массива и комбинатор промисов. Возвращаемое значение у них принципиально разное, булево против промиса, поэтому сильный ответ начинается с уточняющего вопроса, о чём идёт речь.
Как отвечать
Для массива штатный аналог это some: он возвращает true или false, останавливается на первом подошедшем элементе и на пустом массиве даёт false. Именно признак, а не элемент. Нужен элемент, берите find, нужен индекс, берите findIndex.
Для асинхронного случая есть Promise.any: он возвращает промис, который выполняется значением первого успешно выполненного промиса из переданных. Если отклонятся все, промис отклоняется ошибкой AggregateError, а список причин лежит в её поле errors. На пустом входе отклонение происходит сразу.
const hasBig = [1, 2, 3].some((n) => n > 2); // true
const first = await Promise.any([slow(), fast()]);Если просят написать any руками, это цикл с ранним return true и return false после него. Оговорите поведение на пустом входе: false, зеркально к every, которая на пустом массиве возвращает true.
Где спотыкаются
Путают Promise.any и Promise.race. Второй завершается первым завершившимся промисом, включая отклонённый, поэтому одна быстрая ошибка убивает весь результат. Promise.any ждёт первый успешный и сдаётся, только если провалились все.
Ждут, что some вернёт найденный элемент. Дальше появляется if (arr.some(fn)), а за ним второй проход по массиву, чтобы достать то самое значение. Это работа для find в один проход.
Пишут перебор на forEach и пытаются прервать его через break или return. forEach не прерывается, обход пройдёт весь массив, а return выйдет только из колбэка. Нужен обычный цикл, for...of или тот же some.