Estoy trabajando en una función de JavaScript que puede crear un índice H de autores. H-Index es el mayor número de publicaciones que ha escrito un autor con tantas citas en otros artículos. tengo
let array = [0,0,0,1,1,2,3,3,5,6,6,7,20,20,20]Este es el número de artículos citados en orden ascendente
Necesito hacer un bucle en la matriz hasta que el índice sea mayor que el recuento de elementos iguales o superiores al índice
Como
for (let i = 1; i < array.length; i++){ count all items that are above i (0's get skipped) if there are more than i then loop to next i if not exit with i - 1 console.log(i) }Lo que estoy buscando es 6 con un bucle eficiente. Gracias por la ayuda
He jugado con el mapa y filtrado dentro del bucle, pero parece que no puedo obtener la sintaxis correcta
Puede invertir la matriz o ordenarla de manera descendente y encontrar el índice donde el índice (más uno) es mayor que el valor.
const values = [0, 0, 0, 1, 1, 2, 3, 3, 5, 6, 6, 7, 20, 20, 20], hIndex = [...values].reverse().findIndex((v, i) => v < i + 1); console.log(hIndex);Acérquese sin retroceder. Kodos a Jonas Wilms .
const values = [0, 0, 0, 1, 1, 2, 3, 3, 5, 6, 6, 7, 20, 20, 20], length = values.length, hIndex = length - values.findIndex((v, i) => v >= length - i); console.log(hIndex);Tal vez no sea la forma más eficiente, pero se puede hacer con un filtro.
Primero, las matrices se declaran con llaves cuadradas [] , no con llaves {} . Entonces, sería:
let array = [0,0,0,1,1,2,3,3,5,6,6,7,20,20,20]
Y la operación que pides sería:
array .filter((element, index) => element >= index) .lengthLa devolución de llamada que acepta el filtro puede admitir 3 argumentos:
La documentación se puede encontrar aquí .