Помогите, пожалуйста, разобраться с функцией js массивы(В цикле for использовались методы includes и push.)
Помогите пожалуйста (только начал изучать js), мне нужно написать функцию, которая получает два массива произвольной длины в параметры array1 и array2, и возвращает новый массив, состоящий из тех элементов, которые присутствуют в обоих исходных массивах. В цикле for использовались методы includes и push.
const array1 = [1, 2, 5, 3];
const array2 = [1, 2, 7, 3, 8];
function getElements(array1, array2) {
for (let i = 0; i < array1.length; i++) { //проходимся по первому массиву
let newArray = [];
for (let j = 0; j < array2.length; j++) { // по второму
const arr1 = array1[i];
const arr2 = array2[j];
if (arr1 === arr2) { //if (array1[i].includes(array2[j])) //проверяем на совпадение через includes (но у меня не работает)
newArray = array1.push(array2); //возвращаю новый массив, состоящий из тех элементов, которые присутствуют в обоих исходных массивах. (не работает)
}
}
return newArray;
}
Что делаю не так - вообще не понимаю((((
Ответы (4 шт):
Метод push возвращает количество элементов в массиве, после добавления.
Таким образом в строке
newArray = array1.push(array2);
переменной newArray присваивается число.
Вместо этого, нужно было добавлять найденный элемент в сам массив newArray
newArray.push(arr1)
а также необходимо вынести объявление newArray из первого цикла, точно также как и return.
Для случая с includes: внутренний цикл вообще не нужен.
Нужен только if, в котором значение элемента будет проверяться во втором массиве
if (array2.includes(array1[i])) {
// добавляем элемент в newArray
}
Исправленный вариант:
const intersection = (array1, array2) => {
let result = [];
for (let i = 0; i < array1.length; i++) {
if (array2.includes(array1[i])) {
result.push(array1[i]);
}
}
return result;
}
Более короткое и удобное решение:
const intersection = array1.filter(x => array2.includes(x));
Оставлю этот ответ как ненавистник array.includes внутри цикла:
const nums1 = [1, 2, 5, 3];
const nums2 = [1, 2, 7, 3, 8];
const findIntersection = (array1, array2) => {
const array1Set = new Set(array1);
const intersection = [];
for (const num of array2) {
if (array1Set.has(num)) {
intersection.push(num);
}
}
return intersection;
}
console.log(findIntersection(nums1, nums2));
Так сложность алгоритма снижается с O(n * m) до O(n + m), где n и m - это длины массивов соответсвнно
let array = []; const intersection = (num1, num2)
for (i = 0; i < num1.length; i += 1){
num2.includes(num1[i])
?(array.push(num1[i]))
: false;
}