Проверка наличия элементов одного массива в другом в JS
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Если вам необходимо быстро проверить, содержат ли два массива общие элементы, вы можете использовать комбинацию методов array1.some()
и array2.includes()
. Ниже приведён пример, демонстрирующий, как можно сделать это одной строкой:
const sharedElementExists = [1, 2, 3].some(элемент => [3, 4, 5].includes(элемент)); // true, потому что элемнт 3 присутствует в обоих массивах
Этот код вернёт true
, если хоть один элемент из array1
найден в array2
, и false
в противном случае.
Разбор принципов работы
Метод some
применяется к каждому элементу array1
. В свою очередь, в коллбэке метод includes
проверяет, содержится ли текущий элемент array2
. Это довольно эффективная комбинация, которую можно считать вложенной итерацией с алгоритмической сложностью O(n * m), где n
и m
– размеры массивов.
Использование преимуществ короткого цикла
Стоит отметить, что работа метода some
прерывается, как только обнаруживается первое Истина-значение. Это означает, что если элемент из array1
найден в array2
, то дальнейший перебор прекращается. Это может значительно увеличить производительность, особенно в случае раннего обнаружения совпадения.
Работа с массивами разных типов данных
Методы some
и includes
могут быть использованы для массивов различных типов данных: примитивов, объектов, функций, а также с пропуском элементов (т.е. для разреженных массивов).
Выявление всех общих элементов
С помощью сочетания методов filter
и includes
можно найти все пересекающиеся элементы массивов:
const intersections = array1.filter(item => array2.includes(item));
// intersections содержит [3], так как 3 – общий элемент для обоих массивов
Таким образом, вы получите новый массив с элементами, общими для array1
и array2
.
Наглядный пример
Представьте, что вы ищете пересечения между маршрутами пешехода и автомобиля на оживлённом перекрёстке:
Массив 1 (пешеход 🚶♂️): [🔴, 🔵, 🟢]
Массив 2 (автомобиль 🚗): [🟡, 🔵, 🟣]
Рассмотрим потенциальные пересечения:
const commonPath = Array1.some(el => Array2.includes(el));
Существует ли угроза возможного столкновения между пешеходом и автомобилем?
Пересечение маршрутов: [🔵] // Пешеход и автомобиль пересекутся на синем цвете, однако столкновение не произойдет!
Заключение: Есть пересечение маршрутов!
Дополнительные направления исследований
Контроль над пробками
Если вам требуется работать с большими массивами, можно преобразовать array2
в набор (Set), который обычно имеет временную сложность O(1) при проверке наличия элемента:
const array2Set = new Set(array2);
const sharedElementExists = array1.some(элемент => array2Set.has(элемент));
Использование библиотек
Такие библиотеки, как Lodash и Underscore.js, предлагают метод intersection()
, который может быть настроен и эффективен для подобных задач.
Защита от неизвестности
Желательно, чтобы ваше решение было устойчивым к различным неопределённым условиям, таким как null, undefined и массивы разной длины, чтобы функция безошибочно работала в любых ситуациях.
Полезные материалы
- Array.prototype.includes() – JavaScript | MDN – руководство MDN по методу
includes()
. - Array.prototype.some() – JavaScript | MDN – документация MDN по использованию метода
some()
. - Simplest code for array intersection in javascript – Stack Overflow – обсуждение различных подходов к реализации пересекающихся массивов на Stack Overflow.
- Compute intersection of two arrays in JavaScript – Stack Overflow – ещё одна обсуждаемая тема о поиске пересечений массивов на Stack Overflow.
- ECMAScript® 2016 Language Specification – спецификация ECMAScript 2016, описывающая методы работы с массивами, включая
includes()
. - Simple array intersection – пример функции для нахождения пересечения массивов.