← Все вопросы

Как проверить, есть ли элемент в массиве в JavaScript (includes и indexOf)?

Задан 35 месяцев назад1.2к просмотров2 ответа
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 бери, когда нужна и позиция элемента.

Важные ограничения обоих:

  1. Сравнение строгое (как ===). '5' и 5 — не одно и то же:
[1, 2, 3].includes('2'); // false — строка против числа
  1. Не работают для поиска объектов по содержимому — сравниваются по ссылке:
const users = [{ id: 1 }];
users.includes({ id: 1 }); // false — это другой объект в памяти

Для объектов по полю используй some:

users.some(u => u.id === 1); // true
  1. includes (в отличие от indexOf) умеет находить NaN:
[NaN].includes(NaN);  // true
[NaN].indexOf(NaN);   // -1 — не находит!
4

Краткий выбор инструмента:

  • Нужен факт «есть/нет» простого значения → includes.
  • Нужна позиция элемента → indexOf (или findIndex по условию).
  • Нужен факт «есть хоть один подходящий объект» → some.
  • Нужен сам объект → find.

Эти четыре метода закрывают почти все задачи поиска по массиву.

Ваш ответ

, чтобы ответить на вопрос.