Obtuve un resultado inesperado cuando cuento la cantidad de elementos comunes en dos matrices. Cuando uso la función de reduce , no funciona. Pero la versión del filter devuelve el resultado correcto. Quiero saber qué le pasa a mi versión reduce .
var ls = [1, 2, 3, 4, 5]; var ms = [4, 5, 6, 1, 2]; console.log(ls.reduce((acc, e) => (ms.includes(e) ? 1 + acc : 0), 0)); // 2, incorrect console.log(ls.filter(e => ms.includes(e)).length); // 4, correctPorque en su versión reduce , cuando no se encuentra el elemento, restablece la acc a cero en lugar de devolverla como está
var ls = [1, 2, 3, 4, 5]; var ms = [4, 5, 6, 1, 2]; console.log(ls.reduce((acc, e) => (ms.includes(e) ? 1 + acc : acc), 0)); // -----------------------------------------------------------^ here // 4, now correctedCuando su función de devolución de llamada, que es el primer parámetro de la función de reducción, toca el tercer elemento de la matriz ls, "3", descubre que no es miembro de la matriz ms. Esto hace que el operador ternario devuelva la expresión de la derecha 0, que restablece su variable acumuladora, acc. Esto reiniciará el conteo en 0.
En su lugar, debe devolver el valor actual de la variable acumuladora en lugar de 0 como este:
console.log(ls.reduce(acc,e) => (ms.includes(e) ? 1 + acc: acc), 0));Eso le dará la cuenta correcta de 4 elementos coincidentes.