@lobehub/ui
Version:
Lobe UI is an open-source UI component library for building AIGC web apps
1 lines • 2.98 kB
Source Map (JSON)
{"version":3,"file":"merge.mjs","names":["merge: typeof _merge"],"sources":["../../../src/Form/components/merge.ts"],"sourcesContent":["import { merge as _merge, isEmpty, isObject, mergeWith, pickBy } from 'es-toolkit/compat';\n\nexport const removeUndefined = (obj: any): any => {\n if (!isObject(obj)) return obj;\n\n if (Array.isArray(obj)) {\n return obj.map((item) => removeUndefined(item)).filter((item) => item !== undefined);\n }\n\n return pickBy(\n Object.entries(obj).reduce((acc: any, [key, value]) => {\n acc[key] = removeUndefined(value);\n return acc;\n }, {}),\n (value) => value !== undefined,\n );\n};\n\n/**\n * 用于合并对象,如果是数组则直接替换\n * @param target\n * @param source\n */\nexport const merge: typeof _merge = <T = object>(target: T, source: T) =>\n mergeWith({}, target, source, (obj, src) => {\n if (Array.isArray(obj)) return src;\n });\n\ntype MergeableItem = {\n [key: string]: any;\n id: string;\n};\n\n/**\n * Merge two arrays based on id, preserving metadata from default items\n * @param defaultItems Items with default configuration and metadata\n * @param userItems User-defined items with higher priority\n */\nexport const mergeArrayById = <T extends MergeableItem>(defaultItems: T[], userItems: T[]): T[] => {\n // Create a map of default items for faster lookup\n const defaultItemsMap = new Map(defaultItems.map((item) => [item.id, item]));\n\n // 使用 Map 存储合并结果,这样重复 ID 的后项会自然覆盖前项\n const mergedItemsMap = new Map<string, T>();\n\n // Process user items with default metadata\n for (const userItem of userItems) {\n const defaultItem = defaultItemsMap.get(userItem.id);\n if (!defaultItem) {\n mergedItemsMap.set(userItem.id, userItem);\n continue;\n }\n\n const mergedItem: T = { ...defaultItem };\n for (const [key, value] of Object.entries(userItem)) {\n if (value !== null && value !== undefined && !(typeof value === 'object' && isEmpty(value))) {\n // @ts-expect-error\n mergedItem[key] = value;\n }\n\n if (typeof value === 'object' && !isEmpty(value)) {\n // @ts-expect-error\n mergedItem[key] = merge(defaultItem[key], value);\n }\n }\n\n mergedItemsMap.set(userItem.id, mergedItem);\n }\n\n // 添加只在默认配置中存在的项\n for (const item of defaultItems) {\n if (!mergedItemsMap.has(item.id)) {\n mergedItemsMap.set(item.id, item);\n }\n }\n\n return [...mergedItemsMap.values()];\n};\n"],"mappings":";;;AAEA,MAAa,mBAAmB,QAAkB;AAChD,KAAI,CAAC,SAAS,IAAI,CAAE,QAAO;AAE3B,KAAI,MAAM,QAAQ,IAAI,CACpB,QAAO,IAAI,KAAK,SAAS,gBAAgB,KAAK,CAAC,CAAC,QAAQ,SAAS,SAAS,OAAU;AAGtF,QAAO,OACL,OAAO,QAAQ,IAAI,CAAC,QAAQ,KAAU,CAAC,KAAK,WAAW;AACrD,MAAI,OAAO,gBAAgB,MAAM;AACjC,SAAO;IACN,EAAE,CAAC,GACL,UAAU,UAAU,OACtB;;;;;;;AAQH,MAAaA,WAAoC,QAAW,WAC1D,UAAU,EAAE,EAAE,QAAQ,SAAS,KAAK,QAAQ;AAC1C,KAAI,MAAM,QAAQ,IAAI,CAAE,QAAO;EAC/B"}