Когда нужен не новый массив, а ответ на вопрос, обычно используют 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- остановится на первомtrueevery- остановится на первом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, если все элементы прошли проверку.- Эти методы не меняют массив и часто завершаются раньше полного перебора.