From a6a3917986805592d99b0937b41e7a1be42f9d28 Mon Sep 17 00:00:00 2001 From: vcoppe Date: Wed, 24 Dec 2025 12:21:27 +0100 Subject: [PATCH] improve statistics tree performance --- website/src/lib/logic/statistics-tree.ts | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/website/src/lib/logic/statistics-tree.ts b/website/src/lib/logic/statistics-tree.ts index 5a114d944..a1ee5869d 100644 --- a/website/src/lib/logic/statistics-tree.ts +++ b/website/src/lib/logic/statistics-tree.ts @@ -22,25 +22,34 @@ export class GPXStatisticsTree { } getStatisticsFor(item: ListItem): GPXStatistics { - let statistics = new GPXStatistics(); + let statistics = []; let id = item.getIdAtLevel(this.level); if (id === undefined || id === 'waypoints') { Object.keys(this.statistics).forEach((key) => { if (this.statistics[key] instanceof GPXStatistics) { - statistics.mergeWith(this.statistics[key]); + statistics.push(this.statistics[key]); } else { - statistics.mergeWith(this.statistics[key].getStatisticsFor(item)); + statistics.push(this.statistics[key].getStatisticsFor(item)); } }); } else { let child = this.statistics[id]; if (child instanceof GPXStatistics) { - statistics.mergeWith(child); + statistics.push(child); } else if (child !== undefined) { - statistics.mergeWith(child.getStatisticsFor(item)); + statistics.push(child.getStatisticsFor(item)); } } - return statistics; + if (statistics.length === 0) { + return new GPXStatistics(); + } else if (statistics.length === 1) { + return statistics[0]; + } else { + return statistics.reduce((acc, curr) => { + acc.mergeWith(curr); + return acc; + }, new GPXStatistics()); + } } } export type GPXFileWithStatistics = { file: GPXFile; statistics: GPXStatisticsTree };