Вывод одинаковых значений из двух массивов
Написать метод, который определяет, какие элементы присутствуют в двух экземплярах в каждом из массивов (= в двух и более, причем в каждом). На вход подаются два массива. На выходе массив с необходимыми совпадениями. Пример: [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)