deepCloneAndMergeNestedData
JavaScript
// Deep-copies nested values and merges object or Map overrides without mutation.
const isPlainObject = (value) =>
Object.prototype.toString.call(value) === '[object Object]';
export function deepClone(value, seen = new WeakMap()) {
if (value === null || typeof value !== 'object') return value;
if (seen.has(value)) return seen.get(value);
if (value instanceof Map) {
const copy = new Map();
seen.set(value, copy);
for (const [key, item] of value) copy.set(deepClone(key, seen), deepClone(item, seen));
return copy;
}
if (value instanceof Set) {
const copy = new Set();
seen.set(value, copy);
for (const item of value) copy.add(deepClone(item, seen));
return copy;
}
const copy = Array.isArray(value) ? [] : {};
seen.set(value, copy);
for (const key of Object.keys(value)) copy[key] = deepClone(value[key], seen);
return copy;
}
export function deepMerge(base, patch) {
if (Array.isArray(base) || Array.isArray(patch)) return deepClone(patch);
const target = deepClone(base);
if (target instanceof Map && patch instanceof Map) {
for (const [key, value] of patch) target.set(key, deepMerge(target.get(key), value));
return target;
}
if (!isPlainObject(target) || !isPlainObject(patch)) return deepClone(patch);
for (const [key, value] of Object.entries(patch)) {
target[key] = isPlainObject(value) && isPlainObject(target[key])
? deepMerge(target[key], value)
: deepClone(value);
}
return target;
}