From f0a8b288c74d2b496336365cfe54a004d5dc2e17 Mon Sep 17 00:00:00 2001 From: tombuntus Date: Tue, 2 May 2023 21:32:03 +0100 Subject: [PATCH] fix: median aggregation function --- packages/table-core/src/aggregationFns.ts | 22 +++++++++++----------- packages/table-core/src/utils.ts | 4 ++++ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/table-core/src/aggregationFns.ts b/packages/table-core/src/aggregationFns.ts index 2edcc4b173..0652ee0374 100755 --- a/packages/table-core/src/aggregationFns.ts +++ b/packages/table-core/src/aggregationFns.ts @@ -1,4 +1,5 @@ import { AggregationFn } from './features/Grouping' +import { isNumberArray } from './utils' const sum: AggregationFn = (columnId, _leafRows, childRows) => { // It's faster to just add the aggregations together instead of @@ -82,18 +83,17 @@ const median: AggregationFn = (columnId, leafRows) => { return } - let min = 0 - let max = 0 - - leafRows.forEach(row => { - let value = row.getValue(columnId) - if (typeof value === 'number') { - min = Math.min(min, value) - max = Math.max(max, value) - } - }) + const values = leafRows.map(row => row.getValue(columnId)) + if (!isNumberArray(values)) { + return + } + if (values.length === 1) { + return values[0] + } - return (min + max) / 2 + const mid = Math.floor(values.length / 2) + const nums = values.sort((a, b) => a - b) + return values.length % 2 !== 0 ? nums[mid] : (nums[mid - 1]! + nums[mid]!) / 2 } const unique: AggregationFn = (columnId, leafRows) => { diff --git a/packages/table-core/src/utils.ts b/packages/table-core/src/utils.ts index ffbda51180..0eee1050f6 100755 --- a/packages/table-core/src/utils.ts +++ b/packages/table-core/src/utils.ts @@ -103,6 +103,10 @@ export function isFunction(d: any): d is T { return d instanceof Function } +export function isNumberArray(d: any): d is number[] { + return Array.isArray(d) && d.every(val => typeof val === 'number') +} + export function flattenBy( arr: TNode[], getChildren: (item: TNode) => TNode[]