Estoy contando la frecuencia de los números entre 0 y 256 que se encuentran en una secuencia usando una matriz de JavaScript.
Si veo aparecer el número 74, lo estoy almacenando en el valor del índice 74 (es decir, mysequence[74] = mysequence[74] + 1)
Puedo ver los resultados contados y es fácil escanearlo visualmente para ver que ciertos números (por ejemplo, 65) han aparecido con mucha más frecuencia que otros. Quiero encontrar los 10 números que aparecen con más frecuencia.
Me preocupa que una clasificación simple no retenga el valor del índice, que es lo que estoy usando para rastrear qué número está asociado con la frecuencia contada.
El único pensamiento que me viene a la mente sería un enfoque de fuerza bruta. Crear una función para revisar todos los valores uno por uno, manteniendo el más alto e ignorando todos los índices que forman parte de una lista de ignorados. Luego, ejecute esa función 10 veces, cada vez que pase los valores de los índices a los que se les han asignado los valores principales.
¿Hay alguna manera de obtener las claves numéricas asociadas con los 10 valores principales sin recurrir al enfoque anterior? (es decir, ¿tal vez convertir mis datos a un formato diferente y algunas funciones sofisticadas de clasificación de mapas?)
Puede obtener los índices y ordenarlos usando los valores y obtener los índices más buscados.
const values = [7, 3, 4, 5, 2, 8], indices = [...values.keys()].sort((a, b) => values[b] - values[a]); console.log(indices.slice(0, 3));
Si lo ordena de inmediato, definitivamente perderá información sobre los índices. Lo que puede hacer es asignar la matriz con los valores a una matriz con el índice y el valor (para que no pierda información más adelante), luego la ordena, pero cambia los criterios del método de clasificación para obtener los índices con los valores más altos.
const arr = [2, 1, 0, 3]; const getTopN = (arr, n = 10) => { const _arr = arr.map((value, index) => [value, index]); // by using b[0] - a[0] instead of a[0] - b[0] we can get the array in non-increasing order _arr.sort((a, b) => b[0] - a[0]) return _arr.slice(0, n).map(([_, index]) => index); } console.log(getTopN(arr))
La función getTopN
hace el trabajo.
Puede haber otras formas, pero lo que se me ocurre es asignar la matriz original a un conjunto de pares de valor/índice, ordenar el resultado según el valor, luego tomar los últimos (o primeros) 10 elementos de la matriz ordenada (dependiendo de si hizo o no una ordenación ascendente o descendente).
yourArray.map((value, index) => ({ value, index })) .sort((a, b) => b.value - a.value) .slice(0, 10) .map(obj => obj.index);
Puede omitir el último map
si desea mantener tanto los índices como los valores que los acompañan en su resultado.