Помогите, пожалуйста, разобраться с функцией 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 шт):

Автор решения: Grundy

Метод push возвращает количество элементов в массиве, после добавления.

Таким образом в строке

newArray = array1.push(array2);

переменной newArray присваивается число.

Вместо этого, нужно было добавлять найденный элемент в сам массив newArray

newArray.push(arr1)

а также необходимо вынести объявление newArray из первого цикла, точно также как и return.


Для случая с includes: внутренний цикл вообще не нужен.

Нужен только if, в котором значение элемента будет проверяться во втором массиве

if (array2.includes(array1[i])) {
    // добавляем элемент в newArray
}
→ Ссылка
Автор решения: HEXQUE

Исправленный вариант:

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));
→ Ссылка
Автор решения: EzioMercer

Оставлю этот ответ как ненавистник 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 - это длины массивов соответсвнно

→ Ссылка
Автор решения: alex alex

let array = []; const intersection = (num1, num2)

for (i = 0; i < num1.length; i += 1){
   num2.includes(num1[i])
  ?(array.push(num1[i]))
  : false;

}
→ Ссылка