Вывод одинаковых значений из двух массивов

Написать метод, который определяет, какие элементы присутствуют в двух экземплярах в каждом из массивов (= в двух и более, причем в каждом). На вход подаются два массива. На выходе массив с необходимыми совпадениями. Пример: [7, 17, 1, 9, 1, 17, 56, 56, 23], [56, 17, 17, 1, 23, 34, 23, 1, 8, 1] На выходе [1, 17]

Сам код, который не работает как задумывалось. Возможно где-то опечатка. Да и код сам слишком огромный, но в голову другое пока не пришло)

let massive1 = [7, 17, 1, 9, 1, 17, 56, 56, 23];
let massive2 = [56, 17, 17, 1, 23, 34, 23, 1, 8, 1];

function firstFilter(mass) {
let ks=[];
for(let value of mass){
ks[value] = (ks[value]||0)+1;
}
let arr =[];
for(let i in mass) {
if ( ks[ mass[i] ] > 1 ) {
arr.push(mass[i]);
ks[ mass[i] ] = 0;
}
}
return arr;
}

function secondFilter(mass1, mass2) {

let updateMass1 = firstFilter(mass1);
let updateMass2 = firstFilter(mass2);

let i = updateMass1.length, j = updateMass2.length, resultMass = [];
while (i > 0 && j > 0) {
i--;
j--;
if (updateMass1[i] > updateMass2[j]) j++;
else if (updateMass1[i] < updateMass2[j]) i++;
else resultMass.push(updateMass1[i]);
}
return resultMass;
}

console.log (secondFilter(massive1, massive2));

Ответы (2 шт):

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

Можно что-то такое сделать..

UPD: Если добавить проверку if(res.includes(cm[i])) continue; на больших выборках с множеством одинаковых значений, время выполнения сократится ~ в двое

let m1 = [7, 17, 1, 9, 1, 17, 56, 56, 23,1,];
let m2 = [56, 17, 17, 1, 23, 34, 23, 1, 8, 1];


function find(mm1, mm2){
  let res = [];
  let cm = mm1.slice(0); // клонируем массив
  for(let i = 0; i < cm.length; i++){
    if(res.includes(cm[i])) continue; // если текущий уже записан в результат, переходим к следующему
    delete cm[i] // удаляем текущий элемент
    if (cm.includes(mm1[i]) && mm2.includes(mm1[i])) { // проверяем наличие удалённого элемента, если есть и присутствует во втором массиве
        let cm2 = mm2.slice(0); // клонируем второй массив
        delete cm2[cm2.indexOf(mm1[i])] // ищем индекс и удаляем элемент
        if(cm2.includes(mm1[i])) res.push(mm1[i]) // если элемент после удаления встречается в массиве, добавляем 
    }
  }
  return res
}

console.log(find(m1, m2))

→ Ссылка
Автор решения: zalkar mamatkasym
let arr1 = [7, 17, 1, 9, 1, 17, 56, 56, 23];
let arr2 = [56, 17, 17, 1, 23, 34, 23, 1, 8, 1];

function findAndAddSameElems(arr1, arr2) {
  const resultArr = []
  for (let i = 0; i < arr1.length; i++) {
    for (let j = 0; j < arr2.length; j++) {
      if (arr1[i] === arr2[j]) {
        resultArr.push(arr1[i])
      }
    }
  }
  const resultUnicArr = Array.from(new Set(resultArr))
  console.log(resultUnicArr)
}
findAndAddSameElems(arr1, arr2)
→ Ссылка