super-utils-plus
Version:
A superior alternative to Lodash with improved performance, TypeScript support, and developer experience
66 lines (65 loc) • 1.76 kB
JavaScript
import { isArray, isDate, isObject, isRegExp } from '../utils/is';
/**
* Creates a deep clone of value.
* Handles arrays, objects, dates, regexps, maps, sets, and primitive types.
* Functions are referenced, not cloned.
*
* @param value - The value to clone
* @returns The deep cloned value
*
* @example
* ```ts
* const objects = [{ 'a': 1 }, { 'b': 2 }];
*
* const deep = deepClone(objects);
* console.log(deep[0] === objects[0]);
* // => false
* ```
*/
export function deepClone(value) {
// Handle null, undefined, and primitive types
if (value === null || typeof value !== 'object') {
return value;
}
// Handle Dates
if (isDate(value)) {
return new Date(value.getTime());
}
// Handle RegExps
if (isRegExp(value)) {
const flags = value.flags;
const result = new RegExp(value.source, flags);
result.lastIndex = value.lastIndex;
return result;
}
// Handle Maps
if (value instanceof Map) {
const result = new Map();
value.forEach((val, key) => {
result.set(deepClone(key), deepClone(val));
});
return result;
}
// Handle Sets
if (value instanceof Set) {
const result = new Set();
value.forEach((val) => {
result.add(deepClone(val));
});
return result;
}
// Handle Arrays
if (isArray(value)) {
return value.map(item => deepClone(item));
}
// Handle plain Objects
if (isObject(value)) {
const result = {};
Object.entries(value).forEach(([key, val]) => {
result[key] = deepClone(val);
});
return result;
}
// For other types like Functions, return as is
return value;
}