【JavaScript】递归实现一个深拷贝 - Go语言中文社区

【JavaScript】递归实现一个深拷贝


function deepCopy(obj){
	// 递归退出条件
    if(obj === null || typeof obj !== 'object'){
       return obj;
    }
   	const cloneObj = Array.isArray(obj) ? [] : {};
    for(key in obj){
    	//判断是不是自身属性
        if(obj.hasOwnProperty(key)){
            if(typeof obj[key] === 'object'){
                cloneObj[key] = deepCopy(obj[key])
            }else{
                cloneObj[key] = obj[key];
            }
        }
    }
    return cloneObj
}

缺点: 不能解决循环引用的问题

const obj1 = { 
      a: 1,
      b: [ 'e', 'f', 'g'],
      c: { h: { i: 2 } },
      d: function (){}
     }
     obj1.b.push(obj1.c)
     obj1.c.j = obj1.b

const obj3 = deepCopy(obj1);

在这里插入图片描述
改良版 使用map解决循环引用

function deepCopy2(obj, map = new Map()){
    if(obj === null || typeof obj !== 'object'){
       return obj;
    }
    let cloneObj = map.get(obj);
    if(cloneObj){
        return cloneObj;
    }
    cloneObj = Array.isArray(obj) ? [] : {};
    map.set(obj, cloneObj)
    for(key in obj){
        if(obj.hasOwnProperty(key)){
            if(typeof obj[key] === 'object'){
                cloneObj[key] = deepCopy2(obj[key], map)
            }else{
                cloneObj[key] = obj[key];
            }
        }
    }
    return cloneObj
}

在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/lizhengxv/article/details/113838712
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-04-12 08:11:28
  • 阅读 ( 511 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢