var rank1 = 0 var rank2 = 0 var rank3 = 0 var rank4 = 0 const array1 = [Rank1, Rank1, Rank1, Rank3] var Rank1 = Rank1 var Rank2 = Rank2 var Rank3 = Rank3 var Rank4 = Rank4 array1.forEach((Rank1) => { rank1++ }); array1.forEach((Rank2) => { rank2++ }); array1.forEach((Rank3) => { rank3++ }); array1.forEach((Rank4) => { rank4++ }); Estoy tratando de recorrer array1 y guardar la cantidad de veces que ocurrió cada elemento en la matriz en su var.
Por ejemplo, si la matriz contiene dos Rank1, quiero que la variable rank1 sea igual a 2.
si consola.log rango1, rango2, rango3, rango4 obtengo el resultado 4,4,4,4 en lugar del resultado deseado que sería 3,0,1,0 en este caso
En este caso, es mejor usar reduce() en la matriz. Esencialmente, comienza con un objeto vacío y luego comienza a iterar sobre los elementos en su matriz. Si el valor que encuentra es desconocido, agregue el valor como una propiedad al objeto y establezca su valor, es decir, su número de ocurrencias en 1. Si encuentra un valor que ya se conoce, ya debe estar en el objeto, entonces consígalo. Cuéntalo y auméntalo en uno.
Al final del ciclo, tendrá un conteo para cada valor en la matriz. Este algoritmo tiene una complejidad de tiempo de ejecución de O(n) que es un algoritmo asintóticamente óptimo ya que la búsqueda en el objeto ocurre en O(1) . También podría implementar esto con un Map , que sería esencialmente el mismo algoritmo (ver más abajo).
Puede pensar en el objeto Map/JS como sus diferentes variables de conteo rank1 , rank2 , rank3 , .... La única diferencia es que se escala a la cantidad de variables de conteo que necesita y elige la variable que necesita aumentar automáticamente simplemente usando el valor que desea contar.
const array1 = ["Rank1", "Rank1", "Rank1", "Rank3", "Rank2", "Rank4", "Rank1", "Rank3"]; const count = array1.reduce((prev, cur) => { if(prev.hasOwnProperty(cur)) prev[cur]++; else prev[cur] = 1; return prev; }, {}); console.log(count);Rendimiento esperado:
{ Rank1: 4, Rank3: 2, Rank2: 1, Rank4: 1 } const array1 = ["Rank1", "Rank1", "Rank1", "Rank3", "Rank2", "Rank4", "Rank1", "Rank3"]; const count = array1.reduce((prev, cur) => { if(prev.has(cur)){ let currentCount = prev.get(cur); currentCount++; prev.set(cur, currentCount); } else prev.set(cur, 1); return prev; }, new Map()); console.log([...count.entries()]); [ [ "Rank1", 4 ], [ "Rank3", 2 ], [ "Rank2", 1 ], [ "Rank4", 1 ] ]Puede probar el siguiente código a continuación.
var rank1 = 0 var rank2 = 0 var rank3 = 0 var rank4 = 0 const array1 = ['rank1','rank1','rank1','rank3'] array1.forEach( function( item, i ) { eval( item + '+= ' + 1 + ';'); } ); console.log(rank1, rank3);