@cornerstonejs/core
Version:
Cornerstone3D Core
53 lines (52 loc) • 1.5 kB
JavaScript
export function deepClone(value) {
if (typeof structuredClone === 'function') {
try {
return structuredClone(value);
}
catch {
}
}
return cloneValue(value, new WeakMap());
}
function cloneValue(value, seen) {
if (value === null || typeof value !== 'object') {
return value;
}
const existingClone = seen.get(value);
if (existingClone) {
return existingClone;
}
if (value instanceof Date) {
return new Date(value.getTime());
}
if (value instanceof Map) {
const clonedMap = new Map();
seen.set(value, clonedMap);
value.forEach((mapValue, mapKey) => {
clonedMap.set(cloneValue(mapKey, seen), cloneValue(mapValue, seen));
});
return clonedMap;
}
if (value instanceof Set) {
const clonedSet = new Set();
seen.set(value, clonedSet);
value.forEach((setValue) => {
clonedSet.add(cloneValue(setValue, seen));
});
return clonedSet;
}
if (Array.isArray(value)) {
const clonedArray = [];
seen.set(value, clonedArray);
value.forEach((item, index) => {
clonedArray[index] = cloneValue(item, seen);
});
return clonedArray;
}
const clonedObject = {};
seen.set(value, clonedObject);
Reflect.ownKeys(value).forEach((key) => {
clonedObject[key] = cloneValue(value[key], seen);
});
return clonedObject;
}