Skip to content

Commit aa88356

Browse files
authored
fix: relative performance with sorting (#46)
1 parent 3208bf8 commit aa88356

File tree

2 files changed

+28
-24
lines changed

2 files changed

+28
-24
lines changed

src/frontend/components/Standings/hooks/useDriverPositions.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export const useDriverStandings = () => {
7979
const driverStandings: Standings[] = useMemo(() => {
8080
const standings = drivers.map((driver) => {
8181
const driverPos = driverPositions.find(
82-
(driverPos) => driverPos.carIdx === driver.carIdx
82+
(driverPos) => driverPos.carIdx === driver.carIdx,
8383
);
8484

8585
if (!driverPos) return undefined;
@@ -99,7 +99,7 @@ export const useDriverStandings = () => {
9999
let classPosition: number | undefined = driverPos.classPosition;
100100
if (classPosition <= 0) {
101101
const qualifyingPosition = qualifyingPositions?.find(
102-
(q) => q.CarIdx === driver.carIdx
102+
(q) => q.CarIdx === driver.carIdx,
103103
);
104104
classPosition = qualifyingPosition ? qualifyingPosition.Position + 1 : undefined;
105105
}

src/frontend/components/Standings/hooks/useDriverRelatives.tsx

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export const useDriverRelatives = ({ buffer }: { buffer: number }) => {
4545

4646
const player = drivers.find((driver) => driver.carIdx === playerIndex);
4747
const other = drivers.find((driver) => driver.carIdx === otherCarIdx);
48-
48+
4949
// Use the slower car's lap time for more conservative deltas in multiclass
5050
const playerEstLapTime = player?.carClass?.estLapTime ?? 0;
5151
const otherEstLapTime = other?.carClass?.estLapTime ?? 0;
@@ -64,38 +64,42 @@ export const useDriverRelatives = ({ buffer }: { buffer: number }) => {
6464
return timeDelta;
6565
};
6666

67-
const filterAndMapDrivers = () => {
68-
return drivers
69-
.filter((driver) => driver.onTrack || driver.carIdx === playerIndex) // filter out drivers not on track
70-
.filter((driver) => driver.carIdx > -1 && driver.carIdx !== paceCarIdx) // filter out pace car
71-
.map((result) => ({
72-
...result,
73-
relativePct: calculateRelativePct(result.carIdx),
74-
}))
75-
.filter((result) => !isNaN(result.relativePct))
76-
.sort((a, b) => b.relativePct - a.relativePct) // sort by relative pct
77-
.map((result) => ({
67+
const sortedDrivers = drivers
68+
.filter((driver) => driver.onTrack || driver.carIdx === playerIndex) // filter out drivers not on track
69+
.filter((driver) => driver.carIdx > -1 && driver.carIdx !== paceCarIdx) // filter out pace car
70+
.map((result) => {
71+
const relativePct = calculateRelativePct(result.carIdx);
72+
return {
7873
...result,
74+
relativePct,
7975
delta: calculateDelta(result.carIdx),
80-
}))
81-
.filter((result) => !isNaN(result.delta));
82-
};
76+
};
77+
})
78+
.filter((result) => !isNaN(result.relativePct) && !isNaN(result.delta));
8379

84-
const allRelatives = filterAndMapDrivers();
85-
const playerArrIndex = allRelatives.findIndex(
86-
(result) => result.carIdx === playerIndex
80+
const playerArrIndex = sortedDrivers.findIndex(
81+
(result) => result.carIdx === playerIndex,
8782
);
8883

8984
// if the player is not in the list, return an empty array
9085
if (playerArrIndex === -1) {
9186
return [];
9287
}
9388

94-
// buffered slice to get only the drivers around the player
95-
const start = Math.max(0, playerArrIndex - buffer);
96-
const end = Math.min(allRelatives.length, playerArrIndex + buffer + 1);
89+
const player = sortedDrivers[playerArrIndex];
90+
91+
const driversAhead = sortedDrivers
92+
.filter((d) => d.relativePct > 0)
93+
.sort((a, b) => a.relativePct - b.relativePct) // sort ascending (closest to player first)
94+
.slice(0, buffer)
95+
.reverse(); // reverse to get furthest to closest for display
96+
97+
const driversBehind = sortedDrivers
98+
.filter((d) => d.relativePct < 0)
99+
.sort((a, b) => b.relativePct - a.relativePct) // sort descending (closest to player first)
100+
.slice(0, buffer);
97101

98-
return allRelatives.slice(start, end);
102+
return [...driversAhead, player, ...driversBehind];
99103
}, [buffer, playerIndex, carIdxLapDistPct, drivers, paceCarIdx]);
100104

101105
return standings;

0 commit comments

Comments
 (0)