递归函数深拷贝

2018-11-14  本文已影响0人  十九_1186

思路

当我们需要深拷贝一个数组,并且这个数组里面包含数值类型、对象类型,或者数组嵌套数组的时候,先写两个函数,一个是深拷贝数组的方法,一个是深拷贝对象的方法,然后把这两个函数结合到一个函数里。
数组深拷贝
var arr=[1,2,3,4,5,6];
function fun1(arr){
  var arr1=[];
   for(var i=0;i<arr.length;i++){
     arr1.push(arr[i]);
  } 
    return arr1;
}
var res = fun1(arr);
arr.push[0,9,8];
console.log(res);
对象深拷贝
var obj={name:"张三",age:43}
function fun2(obj){
  var obj1={};
  for(x in obj){
    obj1[x]=obj[x];
  }
     return obj1;
}
var res = fun2(obj);
obj.name="李四";
console.log(res);
结合到一个函数里
function fun(arr){
  if(arr.constructor.name==="Array"){
    var arr1=[];
     for(var i=0;i<arr.length;i++){
       arr1.push(arr[i]);
    }
    return arr1;
  }else{
  var obj={}:
  for(x in arr){
    obj[x]=arr[x];
    }
  return obj;
  }
}
上面的这个结合,只是单纯的判断了一下 这个形参是数组还是对象,但是,如果这个形参是个对象数组怎么办,那么就需要再次进行判断了。
function fun(arr){
  if(arr.constructor.name==="Array"){
    var arr1=[];
     for(var i=0;i<arr.length;i++){
        if (typeof(arr[i])==="object"){
          arr1.push(fun1(arr[i]));
        }else{
            arr1.push(arr[i]);
        }
    }
    return arr1;
  }else{
  var obj={}:
  for(x in arr){
    if(typeof(arr[i]==="object")){
        obj[x]=fun1(arr[x]);
    }else{
         obj[x]=arr[x];
        }
    }
  return obj;
  }
}

    var a =[1,2,3,{name:"zhangsan", age:23},[7,8,9]];
    var str= fun1(a);
    a[3].name="lisi";
    console.log(res);
上一篇 下一篇

猜你喜欢

热点阅读