From 4c63b1abb7df9ed5330dc196555a924926fcf684 Mon Sep 17 00:00:00 2001 From: Kirk Lin Date: Tue, 28 Mar 2023 21:34:11 +0800 Subject: [PATCH] refactor: deepMerge (#2649) --- src/utils/index.ts | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/utils/index.ts b/src/utils/index.ts index 0e9b23fc..0ef6b074 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -2,8 +2,8 @@ import type { RouteLocationNormalized, RouteRecordNormalized } from 'vue-router' import type { App, Component } from 'vue'; import { unref } from 'vue'; -import { isObject } from '/@/utils/is'; -import { cloneDeep } from 'lodash-es'; +import { isArray, isObject } from '/@/utils/is'; +import { cloneDeep, mergeWith } from 'lodash-es'; export const noop = () => {}; @@ -33,14 +33,25 @@ export function setObjToUrlParams(baseUrl: string, obj: any): string { return /\?$/.test(baseUrl) ? baseUrl + parameters : baseUrl.replace(/\/?$/, '?') + parameters; } -// 深度合并 -export function deepMerge(src: any = {}, target: any = {}): T { - let key: string; - const res: any = cloneDeep(src); - for (key in target) { - res[key] = isObject(res[key]) ? deepMerge(res[key], target[key]) : target[key]; - } - return res; +/** + + 递归合并两个对象。 + Recursively merge two objects. + @param target 目标对象,合并后结果存放于此。The target object to merge into. + @param source 要合并的源对象。The source object to merge from. + @returns 合并后的对象。The merged object. + */ +export function deepMerge( + target: T, + source: U, +): T & U { + return mergeWith(cloneDeep(target), source, (objValue, srcValue) => { + if (isObject(objValue) && isObject(srcValue)) { + return mergeWith(cloneDeep(objValue), srcValue, (prevValue, nextValue) => { + return isArray(prevValue) ? prevValue.concat(nextValue) : undefined; + }); + } + }); } export function openWindow(