js深拷贝递归实现

方法一:深拷贝递归调用

复制代码
 1  var obj = {
 2     name:"John",
 3        gender:{
 4            a:'男',
 5            b:'女'
 6        },
 7       fn:function(){},
 8       friends:[1,2,3,[25,35]]
 9 }
10 
11 
12 function copy(obj){
13         let newobj = null;   //声明一个变量用来储存拷贝之后的内容
14         
15      //判断数据类型是否是复杂类型,如果是则调用自己,再次循环,如果不是,直接赋值即可,
16      //由于null不可以循环但类型又是object,所以这个需要对null进行判断
17         if(typeof(obj) == 'object' && obj !== null){ 
18         
19         //声明一个变量用以储存拷贝出来的值,根据参数的具体数据类型声明不同的类型来储存
20             newobj = obj instanceof Array? [] : {};   
21             
22         //循环obj 中的每一项,如果里面还有复杂数据类型,则直接利用递归再次调用copy函数
23             for(var i in obj){  
24                 newobj[i] = copy(obj[i])
25             }
26         }else{
27             newobj = obj
28         }    
29         console.log('77',newobj)
30       return newobj;    //函数必须有返回值,否则结构为undefined
31    }
32 
33  let obj2 = copy(obj);
34     obj2.name = 'peter';
35    obj2.gender.a = 'shi';
36   console.log(obj);
37  console.log(obj2);
复制代码

方法二: 递归处理引用类型,数组

复制代码
 1 function deepCopy(target) {
 2   if (typeof target === 'object') {
 3     const newTarget = Array.isArray(target) ? [] : Object.create(null)
 4     for (const key in target) {
 5       newTarget[key] = deepCopy(target[key])
 6     }
 7     return newTarget
 8   } else {
 9     return target
10   }
11 }
复制代码

方法三:哈希表 Map 循环 引用,Map 支持引用类型数据作为键

复制代码
 1 function deepCopy(target, h = new Map) {
 2         if (typeof target === 'object') {
 3                 if (h.has(target)) return h.get(target)
 4                 const newTarget = Array.isArray(target) ? [] : Object.create(null)
 5                 for (const key in target) {
 6                         newTarget[key] = deepCopy(target[key], h)
 7                 }
 8                 h.set(target, newTarget)
 9                 return newTarget
10         } else {
11                 return target
12         }
13 }
复制代码

 

posted @   peter_sdl  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示