← Все вопросы
Как проверить, есть ли элемент в массиве в JavaScript (includes и indexOf)?
7
Нужно понять, содержит ли массив определённое значение — например, есть ли 'admin' в списке ролей. Городить цикл не хочется. Как просто проверить наличие элемента в массиве в JS?
2 ответа
11
✓ Принятый ответ — помог автору
Для простых значений (числа, строки) самый читаемый способ — includes, он возвращает true/false.
const roles = ['user', 'editor', 'admin'];
console.log(roles.includes('admin')); // true
console.log(roles.includes('guest')); // false
Идеально для условий:
if (roles.includes('admin')) {
console.log('Доступ разрешён');
}
indexOf — старший брат, возвращает индекс найденного или -1, если нет. До появления includes проверку писали так:
if (roles.indexOf('admin') !== -1) {
// есть
}
Это работает, но includes нагляднее, когда нужен просто факт наличия. indexOf бери, когда нужна и позиция элемента.
Важные ограничения обоих:
- Сравнение строгое (как
===).'5'и5— не одно и то же:
[1, 2, 3].includes('2'); // false — строка против числа
- Не работают для поиска объектов по содержимому — сравниваются по ссылке:
const users = [{ id: 1 }];
users.includes({ id: 1 }); // false — это другой объект в памяти
Для объектов по полю используй some:
users.some(u => u.id === 1); // true
includes(в отличие от indexOf) умеет находитьNaN:
[NaN].includes(NaN); // true
[NaN].indexOf(NaN); // -1 — не находит!
4
Краткий выбор инструмента:
- Нужен факт «есть/нет» простого значения →
includes. - Нужна позиция элемента →
indexOf(илиfindIndexпо условию). - Нужен факт «есть хоть один подходящий объект» →
some. - Нужен сам объект →
find.
Эти четыре метода закрывают почти все задачи поиска по массиву.
Ваш ответ
, чтобы ответить на вопрос.