diff --git a/src/test/mergeWith.test.ts b/src/test/mergeWith.test.ts new file mode 100644 index 00000000..c01b5654 --- /dev/null +++ b/src/test/mergeWith.test.ts @@ -0,0 +1,16 @@ +import { mergeWith } from '../utils/set'; + +describe('mergeWith array merge', () => { + it('should keep existing array length when merging sparse updates', () => { + const allValues = { list: ['A', 'B', 'C', 'D'] }; + const changedValues = { list: new Array(2) }; + changedValues.list[1] = 'BB'; // 仅更新第 2 项,长度为 2 + + const merged = mergeWith([allValues, changedValues], { + prepareArray: current => [...(current || [])], + }); + + expect(merged.list).toEqual(['A', 'BB', 'C', 'D']); + expect(merged.list).toHaveLength(4); + }); +}); diff --git a/src/utils/set.ts b/src/utils/set.ts index c0db65d5..7d465a56 100644 --- a/src/utils/set.ts +++ b/src/utils/set.ts @@ -111,7 +111,9 @@ export function mergeWith( } keys(value).forEach(key => { - internalMerge([...path, key], loopSet); + if (Object.getOwnPropertyDescriptor(value, key).enumerable) { + internalMerge([...path, key], loopSet); + } }); } } else {