const cloneMap = new Map();
const isRef = (data) => typeof data === 'object'
const isObject = (object) => isRef(object) && {}.toString.call(object) === `[object Object]`
const isArray = (array) => isRef(array) && {}.toString.call(array) === `[object Array]`;
const deepCone = (object) => {
const isObjectTarget = isObject(object);
const isArrayTarget = isArray(object);
const hasClone = cloneMap.get(object);
if (hasClone) {
return hasClone.newObject;
}
if(isObjectTarget) {
const newMapObject = {};
const newObject = {};
newMapObject.newObject = newObject;
cloneMap.set(object, newMapObject);
Object.keys(object).forEach(key => {
newObject[key] = deepCone(object[key]);
});
return newObject;
}
if(isArrayTarget) {
const newMapObject = {};
const newArrayTarget = [];
newMapObject.newObject = newArrayTarget;
cloneMap.set(object, newMapObject);
object.forEach((key,index) => {
newArrayTarget[index] = deepCone(object[index]);
});
return newArrayTarget;
}
return object;
}
const a = {
a: 1,
b: 2,
c: [1,2,3]
}
a.d = a;
a.e = a.c;
const newA = deepCone(a);
console.log(newA);
console.log(newA.d === newA);