Аналог функции in_array() из PHP в JavaScript: решение

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вам нужен JavaScript-аналог функции in_array() из PHP, замечательно подойдет метод Array.includes(), позволяющий проверить, включает ли массив конкретный элемент. Смотрите пример ниже.

JS
Скопировать код
const pets = ['cat', 'dog', 'bat'];
const isDogPresent = pets.includes('dog'); // вернет true

Для поддержки устаревших браузеров, например, IE9 и старше, вы можете использовать метод Array.indexOf(), который возвращает индекс найденного элемента или -1, если элемент не обнаружен.

JS
Скопировать код
const isDogPresent = pets.indexOf('dog') !== -1; // результат также будет true
Кинга Идем в IT: пошаговый план для смены профессии

Поддержка старых браузеров

Дабы реализовать поддержку метода includes() даже в устаревших браузерах, можно применить следующий полифилл:

JS
Скопировать код
if (!Array.prototype.includes) {
  Array.prototype.includes = function(searchElement /*, fromIndex*/) {
    var O = Object(this);
    var len = parseInt(O.length, 10) || 0;
    if (len === 0) {
      return false;
    }
    var n = parseInt(arguments[1], 10) || 0;
    var k = n >= 0 ? n : Math.max(len + n, 0);
    while (k < len) {
      if (searchElement === O[k] ||
         (searchElement !== searchElement && O[k] !== O[k])) { 
        return true;
      }
      k++;
    }
    return false;
  };
}

Если аимеете достичь профессионального уровня: Проверка глубокого равенства

Методы includes и indexOf проводят поверхностное сравнение, что может быть недостаточно при работе со сложными типами данных. В таком случае можно воспользоваться рекурсивной функцией arrayCompare для глубокого сравнения:

JS
Скопировать код
function arrayCompare(value, array) {
  return array.some(function(element) {
    if (element === value) {
      return true;
    }
    if (typeof element === 'object' && typeof value === 'object') {
      return JSON.stringify(element) === JSON.stringify(value);
    }
    return false;
  });
}

const trendyColors = [{ color: 'red' }, { color: 'blue' }];
const isRedFashionable = arrayCompare({ color: 'red' }, trendyColors); // возвращает true

Визуализация

Представьте, что вы член книжного клуба, в котором есть следующий список книг:

Markdown
Скопировать код
Книжный клуб 📚: [JavaScript, Python, Ruby, Java]

И вы хотите узнать:

Markdown
Скопировать код
Находится ли "JavaScript" на полке книжного клуба? 🤔

Для этого в JavaScript существует метод includes():

JS
Скопировать код
const bookshelf = ['JavaScript', 'Python', 'Ruby', 'Java'];
console.log(bookshelf.includes('JavaScript')); // вернет true 🎉

Результат говорит за себя:

Markdown
Скопировать код
📚➡️ "JavaScript"? ➡️ ✅ Да, книга на полке!

Когда нужно выйти на свой путь: Ручная реализация

В определенных сценариях ручная реализация может оказаться более эффективной:

  • Высоконагруженные задачи: Применение кастомных функций может предоставить большую оптимизацию при работе с увесистыми наборами данных.

  • Сложные непримитивные типы: Комплексные данные, включающие в себя объекты и функции, требуют более аккуратного подхода.

  • Модульность кода: Пользовательские функции могут стать лучшим решением для интеграции в вашу собственную инфраструктуру или фреймворк.

Избегаем ловушек: Грязные изменения прототипов

Старайтесь не менять Array.prototype напрямую, чтобы не вызвать конфликты с библиотеками и устранить возможные ошибки. Вместо этого определите вспомогательные функции.

JS
Скопировать код
function inArray(element, array) {
  return array.indexOf(element) > -1;
}

const preferredLanguages = ['Python', 'JavaScript'];
const isJavaScriptPreferred = inArray('JavaScript', preferredLanguages); // Вернет true

Таким образом, вы обеспечиваете сохранность глобального контекста и избегаете возможных конфликтов.

Полезные материалы

  1. Array.prototype.includes() – JavaScript | MDN — документация MDN с подробным описанием метода .includes().
  2. Метод JavaScript Array includes() — объяснение метода .includes() на примерах.
  3. Массивы — подборка материалов по работе с массивами в JavaScript.
  4. Array.prototype.indexOf() – JavaScript | MDN — описание метода .indexOf() как альтернативы .includes().
  5. Как проверить, содержит ли массив значение в JavaScript? – Stack Overflow — обсуждение различных способов проверки содержимого массива.
  6. Сравнение объектов в JavaScript – Stack Overflow — дебаты о сравнении объектов в контексте массивов.
Свежие материалы