From 2989bbded0e12cb351a522c86ea36c35e47e0112 Mon Sep 17 00:00:00 2001 From: xingyuv Date: Wed, 29 Mar 2023 14:13:56 +0800 Subject: [PATCH] refactor: deepMerge --- src/utils/index.ts | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/utils/index.ts b/src/utils/index.ts index 38e0caa..6cb5985 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,21 @@ 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(url: string, opt?: { target?: TargetContext | string; noopener?: boolean; noreferrer?: boolean }) {