From 65d603ba2b9913698f41d5a9433d36be6706a1f4 Mon Sep 17 00:00:00 2001 From: "wangwenlu.kingwl" Date: Wed, 11 Jun 2025 20:22:11 +0800 Subject: [PATCH] feat: add dimension data filter --- .../vchart/src/component/axis/interface/spec.ts | 6 ++++++ .../src/event/events/dimension/util/common.ts | 17 +++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/vchart/src/component/axis/interface/spec.ts b/packages/vchart/src/component/axis/interface/spec.ts index db26c9ad06..a0cd059d00 100644 --- a/packages/vchart/src/component/axis/interface/spec.ts +++ b/packages/vchart/src/component/axis/interface/spec.ts @@ -164,6 +164,12 @@ export interface ILinearAxisSpec { * @since 1.12.4 */ breaks?: ILinearAxisBreakSpec[]; + /** + * 筛选 dimension 数据, 返回值为筛选后的 dimension 数据 + * 本选项会影响到 Tooltip, 以及数据选中状态等, 且比 tooltipFilterRange 优先 + * @since 2..0 + */ + dimensionDataFilter?: (datums: Datum[], dimensionFields: string[], value: unknown) => Datum[]; } export interface IBandAxisSpec { diff --git a/packages/vchart/src/event/events/dimension/util/common.ts b/packages/vchart/src/event/events/dimension/util/common.ts index bd8d96b3fa..871caaab0e 100644 --- a/packages/vchart/src/event/events/dimension/util/common.ts +++ b/packages/vchart/src/event/events/dimension/util/common.ts @@ -65,12 +65,18 @@ export const getDimensionData = ( for (const series of seriesList) { if (series.coordinate === coordinate) { const dimensionField = array(getDimensionField(series)); - const viewData = series.getViewData()?.latestData; + const viewData = series.getViewData()?.latestData as Datum[]; + if (dimensionField && viewData) { + const spec = axis.getSpec() as ICartesianLinearAxisSpec; + const filteredViewData = spec.dimensionDataFilter + ? spec.dimensionDataFilter(viewData, dimensionField, value) + : viewData; + if (isDiscreteAxis) { const datums: Datum[] = []; const datumIdList: number[] = []; - viewData.forEach((datum: any, i: number) => { + filteredViewData.forEach((datum: any, i: number) => { if (datum[dimensionField[0]]?.toString() === value?.toString()) { datums.push(datum); // 获取该维度项所对应的数据 datumIdList.push(i); @@ -87,7 +93,7 @@ export const getDimensionData = ( // 直方图情况,根据范围取 datum const datums: Datum[] = []; const datumIdList: number[] = []; - viewData.forEach((datum: any, i: number) => { + filteredViewData.forEach((datum: any, i: number) => { if ( datum[dimensionField[0]]?.toString() === value?.toString() || (isValid(datum[dimensionField[0]]) && @@ -106,13 +112,12 @@ export const getDimensionData = ( }); } else { // 散点图情况,依据轴上的配置判断 - const spec = axis.getSpec() as ICartesianLinearAxisSpec; const rangeArr = resolveTooltipFilterRange(spec, scale); let datums: Datum[] = []; let datumIdList: number[] = []; if (rangeArr) { // 根据范围取 datum - viewData.forEach((datum: Datum, i: number) => { + filteredViewData.forEach((datum: Datum, i: number) => { if (isValid(datum[dimensionField[0]])) { const delta = datum[dimensionField[0]] - value; if (delta >= rangeArr[0] && delta <= rangeArr[1]) { @@ -125,7 +130,7 @@ export const getDimensionData = ( // 根据最近距离取 datum let minDelta = Infinity; let deltaSign = 0; - viewData.forEach((datum: any, i: number) => { + filteredViewData.forEach((datum: any, i: number) => { if (isValid(datum[dimensionField[0]])) { const delta = Math.abs(datum[dimensionField[0]] - value); const sign = Math.sign(datum[dimensionField[0]] - value);