@modern-kit/utils
Version:
1 lines • 3.64 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../../src/object/merge/index.ts"],"sourcesContent":["import { isPlainObject } from '../../validator/isPlainObject';\nimport { cloneDeep } from '../../common/cloneDeep';\nimport { objectKeys } from '../objectKeys';\n\n/**\n * @description `source` 객체의 속성들을 재귀적으로 `target` 객체에 병합합니다.\n * 배열과 일반 객체는 재귀적으로 병합되며, 배열 혹은 일반 객체가 아닌 `source`의 값들은 `target`에 값이 존재하면 덮어쓰고, 존재하지 않으면 추가됩니다.\n *\n * @template T - 병합할 대상 객체의 타입.\n * @template S - 병합할 소스 객체의 타입.\n * @param {T} target - `source`의 속성을 병합할 대상 객체.\n * @param {S} source - 병합될 속성을 가진 소스 객체.\n * @returns {T & S} - 병합된 대상 객체와 소스 객체의 모든 속성을 포함하는 새로운 객체.\n *\n * @example\n * const target = { a: { x: 1, y: 2 }, b: 2 };\n * const source = { a: { y: 3, z: 4 }, c: 5 };\n * merge(target, source); // { a: { x: 1, y: 3, z: 4 }, b: 2, c: 5 }\n *\n * @example\n * const target = { a: [1, { name: 'modern' }] };\n * const source = { a: [3, { address: 'seoul' }] };\n * merge(target, source); // { a: [3, { name: 'modern', address: 'seoul' }] }\n */\nexport function merge<\n T extends Record<PropertyKey, any>,\n S extends Record<PropertyKey, any>\n>(target: T, source: S): T & S {\n const mergedTarget = cloneDeep(target);\n\n const innerMerge = (target: any, source: any) => {\n const sourceKeys = objectKeys(source);\n\n for (let i = 0; i < sourceKeys.length; i++) {\n const key = sourceKeys[i];\n\n const sourceValue = source[key];\n const targetValue = target[key];\n\n if (Array.isArray(sourceValue)) {\n if (Array.isArray(targetValue)) {\n target[key] = innerMerge(targetValue, sourceValue);\n } else {\n target[key] = innerMerge([], sourceValue);\n }\n } else if (isPlainObject(sourceValue)) {\n if (isPlainObject(targetValue)) {\n target[key] = innerMerge(targetValue, sourceValue);\n } else {\n target[key] = innerMerge({}, sourceValue);\n }\n } else if (targetValue === undefined || sourceValue !== undefined) {\n target[key] = sourceValue;\n }\n }\n return target;\n };\n\n return innerMerge(mergedTarget, source);\n}\n"],"names":["cloneDeep","target","source","objectKeys","isPlainObject"],"mappings":";;;;;;;;AAwBO,SAAS,KAAA,CAGd,QAAW,MAAA,EAAkB;AAC7B,EAAA,MAAM,YAAA,GAAeA,0BAAU,MAAM,CAAA;AAErC,EAAA,MAAM,UAAA,GAAa,CAACC,OAAAA,EAAaC,OAAAA,KAAgB;AAC/C,IAAA,MAAM,UAAA,GAAaC,4BAAWD,OAAM,CAAA;AAEpC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,MAAM,GAAA,GAAM,WAAW,CAAC,CAAA;AAExB,MAAA,MAAM,WAAA,GAAcA,QAAO,GAAG,CAAA;AAC9B,MAAA,MAAM,WAAA,GAAcD,QAAO,GAAG,CAAA;AAE9B,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9B,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9B,UAAAA,OAAAA,CAAO,GAAG,CAAA,GAAI,UAAA,CAAW,aAAa,WAAW,CAAA;AAAA,QACnD,CAAA,MAAO;AACL,UAAAA,QAAO,GAAG,CAAA,GAAI,UAAA,CAAW,IAAI,WAAW,CAAA;AAAA,QAC1C;AAAA,MACF,CAAA,MAAA,IAAWG,oCAAA,CAAc,WAAW,CAAA,EAAG;AACrC,QAAA,IAAIA,oCAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,UAAAH,OAAAA,CAAO,GAAG,CAAA,GAAI,UAAA,CAAW,aAAa,WAAW,CAAA;AAAA,QACnD,CAAA,MAAO;AACL,UAAAA,QAAO,GAAG,CAAA,GAAI,UAAA,CAAW,IAAI,WAAW,CAAA;AAAA,QAC1C;AAAA,MACF,CAAA,MAAA,IAAW,WAAA,KAAgB,MAAA,IAAa,WAAA,KAAgB,MAAA,EAAW;AACjE,QAAAA,OAAAA,CAAO,GAAG,CAAA,GAAI,WAAA;AAAA,MAChB;AAAA,IACF;AACA,IAAA,OAAOA,OAAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO,UAAA,CAAW,cAAc,MAAM,CAAA;AACxC;;;;"}