Методы массивов: find, some, every, includes

find, some, every, includes — методы поиска и проверки массивов: find возвращает первый подходящий элемент, some/every проверяют условие на части или всех элементах, includes проверяет наличие значения.

Зачем нужно

Эти методы делают код декларативным: вместо ручного цикла с флагом found = false вы описываете намерение — «найди элемент», «есть ли хоть один», «все ли». Все они останавливают перебор при первом нужном результате, что эффективнее полного обхода.

Где используется

  • Поиск объекта в массиве по условию (find)
  • Проверка наличия активного пользователя/элемента (some)
  • Валидация — все ли поля заполнены (every)
  • Проверка принадлежности к списку разрешённых значений (includes)

find и findIndex

const users = [
  { id: 1, name: 'Иван',  active: false },
  { id: 2, name: 'Мария', active: true },
  { id: 3, name: 'Пётр',  active: true },
];

// find — первый элемент, удовлетворяющий условию, или undefined
const activeUser = users.find(u => u.active);
console.log(activeUser); // { id: 2, name: 'Мария', active: true }

const missing = users.find(u => u.id === 99);
console.log(missing); // undefined

// findIndex — индекс первого совпадения, или -1
const idx = users.findIndex(u => u.id === 2);
console.log(idx); // 1

some — есть ли хотя бы один

// Возвращает true при первом совпадении, false если ни одного
const hasActive = users.some(u => u.active);
console.log(hasActive); // true

const hasAdmin = users.some(u => u.role === 'admin');
console.log(hasAdmin); // false

// Практика: проверка прав доступа
const allowedRoles = ['admin', 'moderator'];
const canEdit = (user) => allowedRoles.some(r => user.roles.includes(r));

every — все ли удовлетворяют условию

// Возвращает true если условие выполнено для ВСЕХ, false при первом провале
const allActive = users.every(u => u.active);
console.log(allActive); // false

// Валидация формы
const fields = [
  { value: 'Иван', required: true },
  { value: '',     required: true },
  { value: 'test@example.com', required: true },
];

const isFormValid = fields.every(f => !f.required || f.value.trim() !== '');
console.log(isFormValid); // false (второе поле пустое)

includes — прямая проверка по значению

// Использует строгое равенство (===); работает с NaN
const fruits = ['яблоко', 'груша', 'слива'];
console.log(fruits.includes('груша'));   // true
console.log(fruits.includes('манго'));   // false

// includes с fromIndex
console.log(fruits.includes('яблоко', 1)); // false — ищем с индекса 1

// Поддержка NaN (в отличие от indexOf)
console.log([NaN].includes(NaN)); // true
console.log([NaN].indexOf(NaN));  // -1 (не найдёт!)

// Проверка на допустимые значения
const VALID_STATUSES = ['active', 'pending', 'closed'];
function isValidStatus(s) { return VALID_STATUSES.includes(s); }

Сравнение методов

Метод Возвращает Останавливается Для чего
find Элемент или undefined При первом совпадении Найти объект
findIndex Индекс или -1 При первом совпадении Найти индекс
some boolean При первом true Есть хоть один?
every boolean При первом false Все подходят?
includes boolean При первом === Есть значение?

Частые ошибки

  • find vs filterfind возвращает один элемент, filter — массив; не используйте filter(fn)[0] вместо find(fn).
  • includes для объектов[{a:1}].includes({a:1})false; includes сравнивает по ссылке, не по значению; используйте some.
  • Пустой массив и every.every(fn) возвращает true (vacuous truth); учитывайте это при валидации.

Связанные темы

Ресурсы