function arraysCommon(array1, array2) { return array1.filter(x => array2.includes(x)); } Esta función no funciona como yo quiero. Por ejemplo dado array1 = [1,2,3,2,1] y array2 = [5,4,3,2,1] devuelve [1,2,3,2,1] , ya que los elementos 1,2,3 se ven en ambas matrices. Pero quiero que devuelva [1,2,3] en ese orden ya que 1,2,3 se ven solo una vez en array2 y se tratan como entidades separadas.
Así que más o menos la funcionalidad debería ser esa
Intenté recorrer las matrices y verificar y comparar la cantidad de duplicados en cada matriz, pero parece que no puedo hacer que la lógica funcione correctamente. ¿Hay una manera diferente de abordar esto?
Adjunto una imagen de dos diagramas de Venn que podrían aclarar la diferencia. 
Desafortunadamente, se vuelve más complicado porque necesita saber qué números ya ha agregado. En este caso, necesita una matriz temporal para contener el resultado. También necesitamos rastrear si un número existe en la matriz dos veces.
Prueba esto:
function arraysCommon(array1, array2) { //Copy array2 by duplicating and spreading the elements into another array. var copyArray2 = [...array2]; //Temperary Array var temp = []; for (let x of array1) { //Check if the element is in the first array and not already added to the temp array if (copyArray2.includes(x)) { temp.push(x); //Remove item from copy array2 so it cannot be used anymore copyArray2.splice(copyArray2.indexOf(x), 1); } } //Return the temp array return temp; } console.log(arraysCommon([1,2,3,2,1], [5,4,3,2,1])) console.log(arraysCommon([1,2,3,2,1], [2,2,3,3,4]))¡Esto debería funcionar como querías!
// test 1 const array1 = [1,4,1,1,5,9,2,7]; const array2 = [1,8,2,5,1]; // test 2 const array3 = [1,2,3,2,1]; const array4 = [5,4,3,2,1]; const mapper = (array1, array2) => { var obj = {}; array1.forEach((x, indexX) => { array2.forEach((y, indexY) => { if (x == y) { if (!Object.values(obj).includes(indexX) && !obj.hasOwnProperty(indexY)) { obj[indexY] = indexX; return; } } }) }) return Object.values(obj).sort().map(values => array1[values]); } console.log(mapper(array1, array2)); console.log(mapper(array3, array4));Espero que esto ayude. Salud.
Con la clasificación y el conteo esto debería ser posible. Dado que está incrementando cuando encuentra caracteres similares, esto debería estar bien:
const array1= [1,4,1,1,5,9,2,7]; const array2 = [1,8,2,5,1] const array3 = [1,2,3,2,1]; const array4 = [5,4,3,2,1,2] const array5 = [1,2,3,2,1]; const array6 = [2,2,3,3,4] function arraysCommon(array1, array2) { const ans = []; array1.sort(); array2.sort(); let j = 0; let i = 0; while(i<array1.length && j<array2.length){ if(array1[i] === array2[j]){ ans.push(array1[i]); i++; j++; } else if(array2[i] > array1[j]){ i++; } else{ j++; } } console.log(ans); } arraysCommon(array1,array2); arraysCommon(array3,array4); arraysCommon(array5,array6);