Что возвращает метод filter в JavaScript, если ни один элемент не подходит под условие
Что проверяют
Понимаете ли вы, что filter всегда отдаёт новый массив, и умеете ли правильно проверить «ничего не нашлось». Вопрос простой, но неверный ответ означает сломанную ветку в коде, а не теоретический пробел.
Как отвечать
Если ни один элемент не подошёл, возвращается пустой массив, то есть [] с длиной ноль. Не null, не undefined, не исходный массив. Сам исходный массив filter не меняет: он всегда создаёт новый и вызывает предикат для каждого элемента.
const nums = [1, 2, 3];
const big = nums.filter(n => n > 10);
big; // []
big.length; // 0
Boolean(big); // true, пустой массив истинныйОтсюда правило проверки: смотреть на length, а не на сам результат. Пустой массив это объект, а любой объект в булевом контексте истинный, поэтому if (result) сработает всегда.
Если нужен один элемент, а не набор, честнее взять другой метод: find вернёт undefined, когда ничего не подошло, some даст false, findIndex даст -1. Это удобнее, чем брать нулевой элемент результата filter.
Где спотыкаются
Пишут if (result) { ... } else { показать пустое состояние }. Ветка с пустым состоянием не выполняется никогда, пользователь видит пустой список без подсказки. Проверять нужно result.length.
Второе: забывают return в колбэке с телом в фигурных скобках. Функция возвращает undefined, предикат ложен для всех элементов, и результат всегда пустой, хотя данные на месте.
Третье: передают в filter асинхронную функцию. Она возвращает промис, а промис истинный всегда, поэтому отбор не работает вовсе и проходят все элементы. Асинхронный отбор делается через Promise.all с последующим filter по готовым флагам.