Аналог функции in_array() из PHP в JavaScript: решение
Быстрый ответ
Если вам нужен JavaScript-аналог функции in_array()
из PHP, замечательно подойдет метод Array.includes()
, позволяющий проверить, включает ли массив конкретный элемент. Смотрите пример ниже.
const pets = ['cat', 'dog', 'bat'];
const isDogPresent = pets.includes('dog'); // вернет true
Для поддержки устаревших браузеров, например, IE9 и старше, вы можете использовать метод Array.indexOf()
, который возвращает индекс найденного элемента или -1, если элемент не обнаружен.
const isDogPresent = pets.indexOf('dog') !== -1; // результат также будет true
Поддержка старых браузеров
Дабы реализовать поддержку метода includes()
даже в устаревших браузерах, можно применить следующий полифилл:
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 для глубокого сравнения:
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
Визуализация
Представьте, что вы член книжного клуба, в котором есть следующий список книг:
Книжный клуб 📚: [JavaScript, Python, Ruby, Java]
И вы хотите узнать:
Находится ли "JavaScript" на полке книжного клуба? 🤔
Для этого в JavaScript существует метод includes()
:
const bookshelf = ['JavaScript', 'Python', 'Ruby', 'Java'];
console.log(bookshelf.includes('JavaScript')); // вернет true 🎉
Результат говорит за себя:
📚➡️ "JavaScript"? ➡️ ✅ Да, книга на полке!
Когда нужно выйти на свой путь: Ручная реализация
В определенных сценариях ручная реализация может оказаться более эффективной:
Высоконагруженные задачи: Применение кастомных функций может предоставить большую оптимизацию при работе с увесистыми наборами данных.
Сложные непримитивные типы: Комплексные данные, включающие в себя объекты и функции, требуют более аккуратного подхода.
Модульность кода: Пользовательские функции могут стать лучшим решением для интеграции в вашу собственную инфраструктуру или фреймворк.
Избегаем ловушек: Грязные изменения прототипов
Старайтесь не менять Array.prototype
напрямую, чтобы не вызвать конфликты с библиотеками и устранить возможные ошибки. Вместо этого определите вспомогательные функции.
function inArray(element, array) {
return array.indexOf(element) > -1;
}
const preferredLanguages = ['Python', 'JavaScript'];
const isJavaScriptPreferred = inArray('JavaScript', preferredLanguages); // Вернет true
Таким образом, вы обеспечиваете сохранность глобального контекста и избегаете возможных конфликтов.
Полезные материалы
- Array.prototype.includes() – JavaScript | MDN — документация MDN с подробным описанием метода
.includes()
. - Метод JavaScript Array includes() — объяснение метода
.includes()
на примерах. - Массивы — подборка материалов по работе с массивами в JavaScript.
- Array.prototype.indexOf() – JavaScript | MDN — описание метода
.indexOf()
как альтернативы.includes()
. - Как проверить, содержит ли массив значение в JavaScript? – Stack Overflow — обсуждение различных способов проверки содержимого массива.
- Сравнение объектов в JavaScript – Stack Overflow — дебаты о сравнении объектов в контексте массивов.