Пересечение произвольного количества массивов на JavaScript

Давайте напишем функцию getInt, которая будет находить пересечение любого количества массивов.

Пример работы такой функции:

let result = getInt([1, 2, 3], [2, 3, 4], [4, 3, 2]); console.log(result); // выведет [2, 3]

Давайте за основу возьмем функцию getInt для двух массивов, полученную нами в предыдущих уроках:

function getInt(arr1, arr2) { let result = []; for (let elem of arr1) { if (inArray(elem, arr2)) { result.push(elem); } } return result; } function inArray(elem, arr){ return arr.indexOf(elem) !== -1; }

Для начала сделаем так, чтобы параметром можно было передавать любое количество массивов:

function getInt(...arrs){ }

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

for (let elem of arr1) { if (inArray(elem, arr2)) { result.push(elem); } }

Очевидно, что если мы расширяем нашу функцию на много массивов, этот цикл уже не годится.

Теперь у нас должна быть следующая логика: мы должны брать элементы какого-нибудь из массивов (любого) и проверять, что эти элементы есть во всех остальных массивах.

Давайте для начала отделим какой-нибудь из массивов (пусть нулевой) и все остальные массивы:

function getInt(...arrs){ let arr0 = arrs.shift(); }

В приведенном выше коде в переменную arr0 запишется нулевой массив, при этом из переменной arrs он исчезнет и там останутся все остальные массивы.

Пусть теперь у нас есть функция inArrays, параметром принимающая элемент и двухмерный массив, и проверяющая наличия этого элемента в каждом из подмассивов:

function inArrays(elem, arrs){ // код мы напишем позже }

Если бы у нас была описанная функция inArrays, тогда решение всей поставленной задачи выглядело бы так:

function getInt(...arrs){ let result = []; let arr0 = arrs.shift(); for (let elem of arr0) { if (inArrays(elem, arrs)) { result.push(elem); } } return result; }

Реализуем теперь функцию inArrays:

function inArrays(elem, arrs){ for (let arr of arrs) { if (!inArray(elem, arr)) { return false; } } return true; }

Как вы видите, данная функция в своей основе использует функцию inArray, код которой мы взяли из реализации getInt для двух массивов.

Давайте соберем весь наш код вместе и получим решение задачи:

function getInt(...arrs){ let result = []; let arr0 = arrs.shift(); for (let elem of arr0) { if (inArrays(elem, arrs)) { result.push(elem); } } return result; } function inArrays(elem, arrs){ for (let arr of arrs) { if (!inArray(elem, arr)) { return false; } } return true; } function inArray(elem, arr) { return arr.indexOf(elem) !== -1; } // Проверим работу: let result = getInt([1, 2, 3], [2, 3, 4], [4, 3, 2]); console.log(result); // выведет [2, 3]

Самостоятельно, не подсматривая в мой код, повторите решение описанной задачи.