Как реализовать проверку всех элементов массива и вернуть false, если ни один не удовлетворяет условию?
Что проверяют
Знаете ли вы методы массивов настолько, чтобы не писать цикл там, где хватает одного вызова, и понимаете ли их поведение на краях. Следом обычно спрашивают, что вернёт тот же код на пустом массиве и чем some отличается от every.
Как отвечать
Задача ровно описывает Array.prototype.some: он возвращает true, как только предикат вернул истинное значение, и false, если ни один элемент не подошёл. Ничего инвертировать не нужно: const hasMatch = (arr, pred) => arr.some(pred);
Дальше покажите, что понимаете детали:
- короткое замыкание:
someостанавливается на первом совпадении,everyна первом несовпадении. Это не то же самое, чтоfilter(pred).length > 0, который всегда проходит весь массив и создаёт новый; - пустой массив:
[].some(f)даётfalse,[].every(f)даётtrue. Второе часто удивляет, но это обычная логика «для всех элементов пустого множества условие выполнено»; - связь методов: «ни один не подходит» это
!arr.some(pred)илиarr.every(x => !pred(x)), то есть противоположная задача; - разреженные массивы:
someпропускает пустые слоты, предикат на них не вызывается; - ручной вариант: цикл
for...ofсreturn trueвнутри иreturn falseпосле цикла, если методы запрещены условием.
Если спросят про TypeScript: some возвращает boolean и тип элементов не сужает, для этого нужен filter или find с type guard.
Где спотыкаются
Пишут !arr.some(pred) и получают обратный результат: true там, где по условию нужен false. Прочитайте формулировку дважды перед тем, как писать код.
Используют find и проверяют результат на истинность. [0, 1].find(x => x === 0) вернёт 0, и if его отбросит. Для такой проверки подходит some или findIndex(...) !== -1.
Передают асинхронный предикат: arr.some(async x => ...) всегда вернёт true на непустом массиве, потому что промис считается истинным значением. Сначала дождитесь результатов через Promise.all, потом проверяйте.