margin-js | kuworking

Gatsby11tyAstro|UnoCSS|SolidJS

Cómo contar los duplicados en un array en JavaScript

Ojo, este artículo no se ha actualizado desde hace más de 12 meses

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)