Commit 4c63b1abb7df9ed5330dc196555a924926fcf684
Committed by
GitHub
1 parent
5d8d9786
refactor: deepMerge (#2649)
Showing
1 changed file
with
21 additions
and
10 deletions
src/utils/index.ts
... | ... | @@ -2,8 +2,8 @@ import type { RouteLocationNormalized, RouteRecordNormalized } from 'vue-router' |
2 | 2 | import type { App, Component } from 'vue'; |
3 | 3 | |
4 | 4 | import { unref } from 'vue'; |
5 | -import { isObject } from '/@/utils/is'; | |
6 | -import { cloneDeep } from 'lodash-es'; | |
5 | +import { isArray, isObject } from '/@/utils/is'; | |
6 | +import { cloneDeep, mergeWith } from 'lodash-es'; | |
7 | 7 | |
8 | 8 | export const noop = () => {}; |
9 | 9 | |
... | ... | @@ -33,14 +33,25 @@ export function setObjToUrlParams(baseUrl: string, obj: any): string { |
33 | 33 | return /\?$/.test(baseUrl) ? baseUrl + parameters : baseUrl.replace(/\/?$/, '?') + parameters; |
34 | 34 | } |
35 | 35 | |
36 | -// 深度合并 | |
37 | -export function deepMerge<T = any>(src: any = {}, target: any = {}): T { | |
38 | - let key: string; | |
39 | - const res: any = cloneDeep(src); | |
40 | - for (key in target) { | |
41 | - res[key] = isObject(res[key]) ? deepMerge(res[key], target[key]) : target[key]; | |
42 | - } | |
43 | - return res; | |
36 | +/** | |
37 | + | |
38 | + 递归合并两个对象。 | |
39 | + Recursively merge two objects. | |
40 | + @param target 目标对象,合并后结果存放于此。The target object to merge into. | |
41 | + @param source 要合并的源对象。The source object to merge from. | |
42 | + @returns 合并后的对象。The merged object. | |
43 | + */ | |
44 | +export function deepMerge<T extends object | null | undefined, U extends object | null | undefined>( | |
45 | + target: T, | |
46 | + source: U, | |
47 | +): T & U { | |
48 | + return mergeWith(cloneDeep(target), source, (objValue, srcValue) => { | |
49 | + if (isObject(objValue) && isObject(srcValue)) { | |
50 | + return mergeWith(cloneDeep(objValue), srcValue, (prevValue, nextValue) => { | |
51 | + return isArray(prevValue) ? prevValue.concat(nextValue) : undefined; | |
52 | + }); | |
53 | + } | |
54 | + }); | |
44 | 55 | } |
45 | 56 | |
46 | 57 | export function openWindow( | ... | ... |