Давайте напишем функцию 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]
Самостоятельно, не подсматривая в мой код, повторите решение описанной задачи.