UNPKG

@bemedev/types

Version:

Type definitions for Bemedev projects

46 lines (44 loc) 1.73 kB
/** * Creates a deep clone of an object or array, preserving its structure and values. * * * @param value of type {@linkcode PrimitiveObject} The value to deep clone, which can be an object, array, or primitive. * @param formatKey A function to format the keys of the cloned object. If not provided, keys will remain unchanged. * @param refs A map to keep track of already cloned objects to handle circular references. * This is used to prevent infinite loops when cloning objects that reference each other. * @returns A deep clone of the input value, preserving the structure and values of the original object or array. * * Inspired by the `deep-clone` npm {@link https://www.npmjs.com/package/deep-clone|library}, * @see the {@link https://github.com/thebearingedge/deep-clone/blob/main/src/deep-clone.ts|implementation} for more details. */ function deepClone(value, refs = new Map()) { const ref = refs.get(value); if (typeof ref !== 'undefined') return ref; if (Array.isArray(value)) { const clone = []; refs.set(value, clone); for (let i = 0; i < value.length; i++) { clone[i] = deepClone(value[i], refs); } return clone; } if (!(value instanceof Object)) return value; const clone = {}; refs.set(value, clone); const keys = Object.keys(value); for (let i = 0; i < keys.length; i++) { const key = keys[i]; clone[key] = deepClone(value[keys[i]], refs); } if (Object.isFrozen(value)) { Object.freeze(clone); } if (Object.isSealed(value)) { Object.seal(clone); } return clone; } export { deepClone as default }; //# sourceMappingURL=deepclone.js.map