Методы поиска и проверки элементов массива

Методы поиска и проверки элементов массива

Технический фундамент поиска и предикатов

Методы поиска работают на 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. Здесь часто и появляются «невидимые» баги.

Микро-сценарии

  1. Найти первый непрочитанный чат.
const unreadChat = chats.find((chat) => !chat.read);
  1. Проверить, что все поля формы валидны.
const isValid = fields.every((field) => field.valid);

Типичные ошибки

  • Ожидать, что find возвращает индекс.
  • Не обрабатывать undefined после find.
  • Путать some и every.
  • Игнорировать различия типов при проверке.

Краткий итог

  • find возвращает элемент, findIndex — индекс.
  • some проверяет «есть хотя бы один», every — «все подходят».
  • includes удобен для простого поиска примитивов.
  • Всегда учитывай undefined и -1 как «не найдено».
  • Эти методы делают проверки читаемыми и близкими к бизнес-правилам.