Si tienes un array con elementos iguales, cómo los cuentas?
La solución es la que te imaginas, ir por el array e ir viendo si los valores son iguales o no, y la mejor manera de iterar un array y hacer “cosas” es con un reduce
Y en la iteración, “las cosas” que haremos será convertir el array en otro array donde pongamos el valor y el número de repeticiones
const arr = [1, 3, 1, 2, 5, 2, 3, 4, 1, 2, 3, 4, 3]
const resultado = {
1: 3,
2: 3,
3: 4,
4: 2,
5: 1,
}
Y para hacerlo, pues el reduce
o alternativas
// reduce
const arr = [1, 3, 1, 2, 5, 2, 3, 4, 1, 2, 3, 4, 3]
const resultado = arr.reduce((prev, cur) => ((prev[cur] = prev[cur] + 1 || 1), prev), {})
// forEach
const arr = [1, 3, 1, 2, 5, 2, 3, 4, 1, 2, 3, 4, 3]
const resultado = {}
arr.forEach(el => (resultado[el] = resultado[el] + 1 || 1))
// for..of
const arr = [1, 3, 1, 2, 5, 2, 3, 4, 1, 2, 3, 4, 3]
const resultado = {}
for (const el of arr) resultado[el] = resultado[el] + 1 || 1
Y si comparo las opciones en perf.link tengo que el más rápido es el forEach
con 270K operaciones por segundo, seguido del for..of
con 230K operaciones y por último el reduce
con 200K operaciones
Quizá es porque el forEach
ejecuta en paralelo todas las iteraciones, y hoy en día las cpu’s están optimizadas para esto?
*En el primer ejemplo con el reduce
nos aseguramos de devolver el valor de prev
porque utilizamos la expresión (x, y)
, con esta expresión aparte de ejecutar las dos partes, siempre devuelve la de la derecha, lo puedes leer en el comma operator)