Overview
Implement deepClone(value) handling:
- Circular references
Date,RegExp,Map,Set- Nested objects and arrays
Constraints
- Must not enter infinite loops on circular refs
- Preserve prototypes of built-in types
Examples
const obj = { a: new Date(), b: /test/gi };
const clone = deepClone(obj);
clone.a !== obj.a; // true, different instancesSolution
Reveal solution
function deepClone(value, seen = new Map()) {
if (value === null || typeof value !== 'object') return value;
if (seen.has(value)) return seen.get(value);
if (value instanceof Date) return new Date(value.getTime());
if (value instanceof RegExp) return new RegExp(value.source, value.flags);
if (value instanceof Map) {
const m = new Map();
seen.set(value, m);
value.forEach((v, k) => m.set(deepClone(k, seen), deepClone(v, seen)));
return m;
}
if (value instanceof Set) {
const s = new Set();
seen.set(value, s);
value.forEach(v => s.add(deepClone(v, seen)));
return s;
}
const result = Array.isArray(value) ? [] : {};
seen.set(value, result);
for (const key of Object.keys(value)) result[key] = deepClone(value[key], seen);
return result;
}deep-clone-ii.js
Deep Clone II
hardcodingJavaScriptObjects
Overview
Implement deepClone(value) handling:
- Circular references
Date,RegExp,Map,Set- Nested objects and arrays
Constraints
- Must not enter infinite loops on circular refs
- Preserve prototypes of built-in types
Examples
const obj = { a: new Date(), b: /test/gi };
const clone = deepClone(obj);
clone.a !== obj.a; // true, different instancesSolution
Reveal solution
function deepClone(value, seen = new Map()) {
if (value === null || typeof value !== 'object') return value;
if (seen.has(value)) return seen.get(value);
if (value instanceof Date) return new Date(value.getTime());
if (value instanceof RegExp) return new RegExp(value.source, value.flags);
if (value instanceof Map) {
const m = new Map();
seen.set(value, m);
value.forEach((v, k) => m.set(deepClone(k, seen), deepClone(v, seen)));
return m;
}
if (value instanceof Set) {
const s = new Set();
seen.set(value, s);
value.forEach(v => s.add(deepClone(v, seen)));
return s;
}
const result = Array.isArray(value) ? [] : {};
seen.set(value, result);
for (const key of Object.keys(value)) result[key] = deepClone(value[key], seen);
return result;
}NameTopicDifficulty
103 of 103 problems