深度克隆自循环问题

"Hello World, Hello Blog"

Posted by wudimingwo on December 15, 2018

obj.a = obj; 这种情况如果不进行处理, 就会无限循环下去,栈溢出.

版本1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
            function clone (origin, target) {
            	var target = target || {};
            	var objStr = Object.prototype.toString;
            	for(var key in origin) {
            	  if (origin.hasOwnProperty(key) && origin[key] !== null) {
            	    if(origin == origin[key]){// 防止自循环
            	      target[key] = target;
            	    }else if (objStr.call(origin[key]) == "[object Object]") {
            	  	    target[key] = {};
            	  	      console.log(target == origin[key]);
            	  	      clone(origin[key],target[key]);
            	    } else if (objStr.call(origin[key]) == "[object Array]"){
            	  	    target[key] = [];
            	  	    clone(origin[key],target[key]);
            	    } else {
            	         target[key] = origin[key];
            	    }
            	  	
            	  }
            	}
            	return target;
            }

版本一不能解决 obj.a.b.c = obj; 版本二 用一个数组,进行辅助筛选 但性能估计会差很多. 下面的结构没有优化, 先凑合记录一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function clone (origin, target,arr) {
            	var target = target || {};
            	var objStr = Object.prototype.toString;
            	// 思路是, 所有 obj, arr 都放进一个数组.
            	// 每次,我们都遍历一下. 如果相同就 continue 跳过去
            	// 如果一个都不同, 就 push进去.
            	var arr = arr || [origin];
            	for(var key in origin) {
            	  if (origin.hasOwnProperty(key) && origin[key] !== null) {
            	    if (objStr.call(origin[key]) == "[object Object]") {
            	  	      if (arr.indexOf(origin[key]) != -1) {
            	  	      	continue;
            	  	      }else{
            	  	        arr.push(origin[key]);
            	  	        console.log(arr);
            	  	      }
            	  	      target[key] = {};
            	  	      clone(origin[key],target[key],arr);
            	  	      
            	  	      
            	    } else if (objStr.call(origin[key]) == "[object Array]"){
            	        if (arr.indexOf(origin[key]) != -1) {
                          continue;
                        }else{
                          arr.push(origin[key]);
                        }
            	  	    target[key] = [];
            	  	    clone(origin[key],target[key]);
            	    } else {
            	         target[key] = origin[key];
            	    }
            	  	
            	  }
            	}
            	return target;
            }

深度复制对象已解决循环引用

看到有一个用es6的, 有点没看懂,先记录一下 图片.png