Learn JavaScript

find, some, every: поиск и проверки в массивах

Когда нужен не новый массив, а ответ на вопрос, обычно используют find, some и every.

  • find - найти первый подходящий элемент
  • some - проверить, что хотя бы один элемент подходит
  • every - проверить, что все элементы подходят

Все три метода не меняют исходный массив.

find: найти первый подходящий элемент

find возвращает первый элемент, для которого колбэк вернул true. Если ничего не найдено, возвращает undefined.

const nums = [3, 10, 2, 8, 1];

const firstBig = nums.find(n => n > 5);
console.log(firstBig); // 10

find на объектах

const users = [
  { id: 1, name: "Sam" },
  { id: 2, name: "Alex" },
  { id: 3, name: "Kim" }
];

const user = users.find(u => u.id === 2);
console.log(user); // { id: 2, name: "Alex" }

Если ничего не найдено

const users = [{ id: 1, name: "Sam" }];

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

some: есть ли хотя бы один подходящий

some возвращает boolean: true, если хотя бы один элемент прошел проверку.

const nums = [1, 3, 5, 6];

const hasEven = nums.some(n => n % 2 === 0);
console.log(hasEven); // true

Если подходящих нет:

const nums = [1, 3, 5];

const hasEven = nums.some(n => n % 2 === 0);
console.log(hasEven); // false

Пример с объектами

const users = [
  { id: 1, isActive: false },
  { id: 2, isActive: true }
];

const anyActive = users.some(u => u.isActive);
console.log(anyActive); // true

every: подходят ли все

every возвращает boolean: true, если все элементы прошли проверку. Если хотя бы один не прошел - false.

const nums = [2, 4, 6];

const allEven = nums.every(n => n % 2 === 0);
console.log(allEven); // true
const nums = [2, 3, 6];

const allEven = nums.every(n => n % 2 === 0);
console.log(allEven); // false

Пример: проверка валидности

const values = ["10", "20", "30"];

const allNumbers = values.every(v => Number.isFinite(Number(v)));
console.log(allNumbers); // true

Важная особенность: раннее завершение

find, some и every обычно прекращают перебор, как только ответ уже понятен:

  • find - остановится на первом совпадении
  • some - остановится на первом true
  • every - остановится на первом false

Это делает их удобнее, чем filter, когда нужен именно “первый” или “да/нет”.

Что выбрать: краткая шпаргалка

  • Нужен элемент - find
  • Нужен ответ есть ли хоть один - some
  • Нужен ответ все ли подходят - every
  • Нужны все подходящие элементы - filter

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

1) Ожидание, что find вернет индекс

find возвращает элемент, не индекс.

const nums = [10, 20, 30];

const found = nums.find(n => n === 20);
console.log(found); // 20

Если нужен индекс, есть findIndex, но это отдельный метод.

2) Путаница some и every

  • some - хотя бы один
  • every - все
const nums = [1, 2, 3];

console.log(nums.some(n => n > 2));  // true
console.log(nums.every(n => n > 2)); // false

3) Проверка через truthy/falsy без понимания смысла

Колбэк должен возвращать условие. Если вернуть значение, оно приведется к boolean, и это может дать неожиданный результат.

Лучше:

const values = ["a", "", "b"];

const hasEmpty = values.some(v => v === "");
console.log(hasEmpty); // true

Что стоит запомнить

  • find возвращает первый подходящий элемент или undefined.
  • some возвращает true, если хотя бы один элемент прошел проверку.
  • every возвращает true, если все элементы прошли проверку.
  • Эти методы не меняют массив и часто завершаются раньше полного перебора.