From 51d8e133a71acdf45a15da90c4f6331ac9bdd276 Mon Sep 17 00:00:00 2001 From: Georgi Stoyanov Date: Tue, 22 Sep 2026 08:19:27 +0300 Subject: [PATCH 1/2] perf: optimize display value label lookup --- src/TreeSelect.tsx | 11 ++++++++++- tests/Select.checkable.spec.tsx | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/TreeSelect.tsx b/src/TreeSelect.tsx index 75d88f8c..f2fbab58 100644 --- a/src/TreeSelect.tsx +++ b/src/TreeSelect.tsx @@ -412,9 +412,18 @@ const TreeSelect = React.forwardRef((props, ref) // Convert to value and filled with label const values = displayKeys.map(key => keyEntities[key]?.node?.[mergedFieldNames.value] ?? key); + // Avoid an O(displayed values × selected values) lookup + const labeledValueMap = new Map(); + rawLabeledValues.forEach(item => { + // Match `find` by keeping the first entry when controlled values contain duplicates. + if (!labeledValueMap.has(item.value)) { + labeledValueMap.set(item.value, item); + } + }); + // Back fill with origin label const labeledValues = values.map(val => { - const targetItem = rawLabeledValues.find(item => item.value === val); + const targetItem = labeledValueMap.get(val); const label = labelInValue ? targetItem?.label : treeTitleRender?.(targetItem); return { value: val, diff --git a/tests/Select.checkable.spec.tsx b/tests/Select.checkable.spec.tsx index 646c608d..f30cbb88 100644 --- a/tests/Select.checkable.spec.tsx +++ b/tests/Select.checkable.spec.tsx @@ -531,6 +531,30 @@ describe('TreeSelect.checkable', () => { expect(getSelectionText(container, 0)).toEqual('0-0'); }); + it('preserves labels with SHOW_ALL', () => { + const { container } = render( + + + + + , + ); + + expect(getSelections(container)).toHaveLength(2); + expect([getSelectionText(container, 0), getSelectionText(container, 1)]).toEqual([ + 'Custom parent', + 'Custom child', + ]); + }); + // https://github.com/ant-design/ant-design/issues/38126 it('keep label when not in options', () => { const onChange = jest.fn(); From 7e770c54d8341dd2a192ae0e1d1d68988992644b Mon Sep 17 00:00:00 2001 From: Georgi Stoyanov Date: Tue, 22 Sep 2026 09:50:21 +0300 Subject: [PATCH 2/2] test: update test to cover duplicate values --- tests/Select.checkable.spec.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/Select.checkable.spec.tsx b/tests/Select.checkable.spec.tsx index f30cbb88..685d18f4 100644 --- a/tests/Select.checkable.spec.tsx +++ b/tests/Select.checkable.spec.tsx @@ -538,7 +538,8 @@ describe('TreeSelect.checkable', () => { showCheckedStrategy={SHOW_ALL} labelInValue value={[ - { value: 'parent', label: 'Custom parent' }, + { value: 'parent', label: 'First parent label' }, + { value: 'parent', label: 'Second parent label' }, { value: 'child', label: 'Custom child' }, ]} > @@ -550,7 +551,7 @@ describe('TreeSelect.checkable', () => { expect(getSelections(container)).toHaveLength(2); expect([getSelectionText(container, 0), getSelectionText(container, 1)]).toEqual([ - 'Custom parent', + 'First parent label', 'Custom child', ]); });