Методы поиска и проверки элементов массива
Методы поиска и проверки элементов массива
Технический фундамент поиска и предикатов
Методы поиска работают на callback-предикате: функция должна вернуть true или false для текущего элемента.
Разница методов — в типе результата: элемент, индекс или булево значение.
const values = [3, 7, 10];
console.log(values.find((n) => n > 5)); // 7
console.log(values.findIndex((n) => n > 5)); // 1
console.log(values.some((n) => n > 9)); // true
Ключевой момент: выбирай метод по форме результата, которую ожидает следующий шаг логики.
Поиск первого подходящего: find
find(callback) возвращает первый элемент, который удовлетворяет условию.
const products = [
{ id: 1, price: 1200 },
{ id: 2, price: 800 },
{ id: 3, price: 1500 },
];
const expensive = products.find((item) => item.price > 1000);
console.log(expensive); // { id: 1, price: 1200 }
Если ничего не найдено, будет undefined.
Поиск индекса: findIndex
findIndex возвращает индекс первого подходящего элемента или -1.
const users = ['Ann', 'Max', 'Leo'];
const index = users.findIndex((name) => name === 'Max');
console.log(index); // 1
Проверки условий: some и every
some отвечает на вопрос «хотя бы один?».
const scores = [60, 70, 40, 90];
console.log(scores.some((n) => n < 50)); // true
every отвечает «все?».
console.log(scores.every((n) => n >= 40)); // true
console.log(scores.every((n) => n >= 70)); // false
Проверь себя: чем отличаются some и every, если массив пустой?
Подсказка:
console.log([].some(() => true)); // false
console.log([].every(() => false)); // true
some не находит ни одного элемента, который дал бы true.
every не находит ни одного элемента, который нарушает условие (поэтому результат true).
Проверка наличия простого значения: includes
Для примитивов (string, number, boolean) часто проще использовать includes.
const permissions = ['read', 'write'];
console.log(permissions.includes('write')); // true
Что будет, если входные данные меняются
const ids = [1, 2, 3];
console.log(ids.find((id) => id === '2')); // undefined
console.log(ids.includes('2')); // false
Строка '2' не равна числу 2. Здесь часто и появляются «невидимые» баги.
Микро-сценарии
- Найти первый непрочитанный чат.
const unreadChat = chats.find((chat) => !chat.read);
- Проверить, что все поля формы валидны.
const isValid = fields.every((field) => field.valid);
Типичные ошибки
- Ожидать, что
findвозвращает индекс. - Не обрабатывать
undefinedпослеfind. - Путать
someиevery. - Игнорировать различия типов при проверке.
Краткий итог
findвозвращает элемент,findIndex— индекс.someпроверяет «есть хотя бы один»,every— «все подходят».includesудобен для простого поиска примитивов.- Всегда учитывай
undefinedи-1как «не найдено». - Эти методы делают проверки читаемыми и близкими к бизнес-правилам.