UNPKG

@modern-kit/utils

Version:
1 lines 4.57 kB
{"version":3,"file":"index.cjs","sources":["../../../src/common/cloneDeep/index.ts"],"sourcesContent":["/**\n * @description 인자로 넣은 값을 깊게 복사 함수입니다.\n * 자주 사용하는 원시 타입, 배열, Set, Map, Date, RegExp, 그리고 일반 객체를 지원하며, 순환 참조도 처리합니다.\n *\n * @template T 복사할 값의 타입\n * @param {T} value 깊은 복사를 수행할 대상 값\n * @returns {T} 입력된 값의 깊은 복사본을 반환합니다.\n *\n * @example\n * const original = { a: 1, b: { c: 2 } };\n * const copied = cloneDeep(original);\n *\n * copied; // { a: 1, b: { c: 2 } }\n * copied !== original; // true\n * copied.b !== original.b; // true\n */\nexport function cloneDeep<T>(value: T): T {\n const referenceMap = new WeakMap();\n\n const copyWthRecursion = (target: T): T => {\n // Primitive Type\n if (typeof target !== 'object' || target === null) {\n return target;\n }\n\n // Handling circular references\n if (referenceMap.has(target)) {\n return referenceMap.get(target);\n }\n\n // Array\n if (Array.isArray(target)) {\n const newArray = new Array(target.length);\n referenceMap.set(target, newArray);\n\n for (let i = 0; i < target.length; i++) {\n newArray[i] = copyWthRecursion(target[i]);\n }\n return newArray as T;\n }\n\n // Set\n if (target instanceof Set) {\n const newSet = new Set();\n referenceMap.set(target, newSet);\n\n for (const item of target) {\n newSet.add(copyWthRecursion(item));\n }\n return newSet as T;\n }\n\n // Map\n if (target instanceof Map) {\n const newMap = new Map();\n\n referenceMap.set(target, newMap);\n for (const [key, value] of target) {\n newMap.set(copyWthRecursion(key), copyWthRecursion(value));\n }\n return newMap as T;\n }\n\n // Date\n if (target instanceof Date) {\n return new Date(target.getTime()) as T;\n }\n\n // RegExp\n if (target instanceof RegExp) {\n const result = new RegExp(target.source, target.flags);\n result.lastIndex = target.lastIndex;\n\n return result as T;\n }\n\n // Object\n const newObject: Record<PropertyKey, any> = {};\n referenceMap.set(target, newObject);\n\n const keys = Reflect.ownKeys(target); // symbol 유지\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n\n newObject[key] = copyWthRecursion(\n (target as Record<PropertyKey, any>)[key]\n );\n }\n\n return newObject as T;\n };\n\n return copyWthRecursion(value);\n}\n"],"names":["value"],"mappings":";;AAgBO,SAAS,UAAa,KAAA,EAAa;AACxC,EAAA,MAAM,YAAA,uBAAmB,OAAA,EAAQ;AAEjC,EAAA,MAAM,gBAAA,GAAmB,CAAC,MAAA,KAAiB;AAEzC,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,EAAM;AACjD,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,EAAG;AAC5B,MAAA,OAAO,YAAA,CAAa,IAAI,MAAM,CAAA;AAAA,IAChC;AAGA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,MAAM,QAAA,GAAW,IAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACxC,MAAA,YAAA,CAAa,GAAA,CAAI,QAAQ,QAAQ,CAAA;AAEjC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,QAAA,QAAA,CAAS,CAAC,CAAA,GAAI,gBAAA,CAAiB,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MAC1C;AACA,MAAA,OAAO,QAAA;AAAA,IACT;AAGA,IAAA,IAAI,kBAAkB,GAAA,EAAK;AACzB,MAAA,MAAM,MAAA,uBAAa,GAAA,EAAI;AACvB,MAAA,YAAA,CAAa,GAAA,CAAI,QAAQ,MAAM,CAAA;AAE/B,MAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,QAAA,MAAA,CAAO,GAAA,CAAI,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAAA,MACnC;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,kBAAkB,GAAA,EAAK;AACzB,MAAA,MAAM,MAAA,uBAAa,GAAA,EAAI;AAEvB,MAAA,YAAA,CAAa,GAAA,CAAI,QAAQ,MAAM,CAAA;AAC/B,MAAA,KAAA,MAAW,CAAC,GAAA,EAAKA,MAAK,CAAA,IAAK,MAAA,EAAQ;AACjC,QAAA,MAAA,CAAO,IAAI,gBAAA,CAAiB,GAAG,CAAA,EAAG,gBAAA,CAAiBA,MAAK,CAAC,CAAA;AAAA,MAC3D;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,kBAAkB,IAAA,EAAM;AAC1B,MAAA,OAAO,IAAI,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA;AAAA,IAClC;AAGA,IAAA,IAAI,kBAAkB,MAAA,EAAQ;AAC5B,MAAA,MAAM,SAAS,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,OAAO,KAAK,CAAA;AACrD,MAAA,MAAA,CAAO,YAAY,MAAA,CAAO,SAAA;AAE1B,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,YAAsC,EAAC;AAC7C,IAAA,YAAA,CAAa,GAAA,CAAI,QAAQ,SAAS,CAAA;AAElC,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AAEnC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAElB,MAAA,SAAA,CAAU,GAAG,CAAA,GAAI,gBAAA;AAAA,QACd,OAAoC,GAAG;AAAA,OAC1C;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO,iBAAiB,KAAK,CAAA;AAC/B;;;;"}