前端深拷贝

115 阅读1分钟
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);