En una tabla de clasificación, me encontré con el problema antes mencionado. Hago una lista donde clasifico a los jugadores según sus puntos. Luego los represento usando el index + 1 para obtener su posición en la lista. Pero en casos de igualdad, uno obtiene el segundo y el otro tercero, etc.
Primero pensé en tener un índice para cada jugador, pero eso sería una exageración, ya que cada vez que un jugador cambiaría sus puntos, tendría que cambiar los índices de otros jugadores también, para ajustar la lista actualizada.
Creo que necesito algo que verifique los puntos, y si son los mismos que el siguiente jugador, asigne el mismo índice. Luego, si el siguiente jugador tiene menos puntos, obtenga el índice, reste el número de jugadores que tuvieron los mismos puntos y dé el resultado como su índice.
¿Es esa una buena solución?
Si alguien quisiera ayudar, tengo aquí un ejemplo mínimo reproducible.
Gracias
Aquí esta lo que hice. Tomé la lista ordenada, la repasé y verifiqué si el valor anterior era el mismo que el valor actual en la iteración. Si el valor es el mismo, no hay necesidad de aumentar la posición, pero si es diferente, agregue uno a la posición.
https://codesandbox.io/s/players-with-same-points-forked-lkhcu6
Puedes count cuántas personas tienen más puntos que el jugador, y la posición para ese jugador es esa count + 1 . Necesitas un conteo extra para cada jugador, pero si la lista no es muy grande, esta puede ser una solución. Por ejemplo:
let players = [ { name: "John", points: 4 }, { name: "Bill", points: 3 }, { name: "Mark", points: 4 }, { name: "Helen", points: 2 }, { name: "Mary", points: 10 } ]; const list = players.sort((a, b) => (a.points < b.points ? 1 : -1)); function countPlayersMithMorePoints(points){ return players.filter(player => player.points > points).length + 1; } players = players.map(player => { return { ...player, position: countPlayersMithMorePoints(player.points) } }) console.log(players)Así que en este caso. "Mark" y "Jhon" tienen 4 puntos... por lo que ambos están en el segundo lugar. Y Helen está en el cuarto lugar. No hay un tercer lugar.