Как найти элемент в массиве по условию через find в JavaScript?
Есть массив объектов-товаров, нужно достать один объект по id. Перебирать циклом и ломать через break как-то громоздко. Подскажите, как найти элемент в массиве по условию — вроде есть метод find?
2 ответа
find возвращает первый элемент, для которого функция вернула true, и сразу останавливается. Если ничего не нашёл — вернёт undefined.
const products = [
{ id: 1, name: 'Книга' },
{ id: 2, name: 'Ручка' },
{ id: 3, name: 'Тетрадь' }
];
const item = products.find(p => p.id === 2);
console.log(item); // { id: 2, name: 'Ручка' }
Чем отличается от filter: filter всегда возвращает массив (пусть и из одного элемента), а find — сам элемент (или undefined). Если тебе нужен один объект — бери find.
Важно проверять результат на undefined, иначе словишь ошибку при обращении к полю:
const item = products.find(p => p.id === 99);
console.log(item); // undefined
// console.log(item.name); // TypeError: Cannot read properties of undefined
if (item) {
console.log(item.name);
}
Родственные методы:
findIndex— вернёт индекс найденного (или -1).includes— есть ли значение в массиве (true/false), удобно для простых значений.indexOf— индекс значения (или -1), тоже для простых значений, не для объектов по полю.
Если нужно просто проверить «есть ли вообще такой элемент» — необязательно find. Для простых значений короче includes:
const ids = [1, 2, 3];
console.log(ids.includes(2)); // true
А для «есть ли хоть один подходящий объект» — some:
const hasExpensive = products.some(p => p.price > 1000);
some возвращает true/false, а не сам элемент.