多层级数组源数据data赋值给res,当res改变数据时源数据data也跟随着改变,真是令人头痛。如果我们想改变res数据的同时又不想源数据data改变,以下方法深拷贝能解决上述问题。
function deepCopy(data) {
if (data.constructor.name === 'Array') {
// 判断为数组类型
var arrCopy = []
for (var i = 0, len = data.length; i < len; i++) {
//遍历数组
if (data[i] instanceof Object) {
// arrary object null以下有关于instanceof的注解
arrCopy.push(deepCopy(data[i]))
} else {
// 基本类型
arrCopy.push(data[i])
}
}
return arrCopy;
} else { // 为对象
var objCopy = {};
for (x in data) {
if(data[x] instanceof Object){
objCopy[x] = deepCopy(data[x])
}else{ // 基本类型
objCopy[x] = data[x];
}
}
return objCopy;
}
}
var data = [
{
name:"lisi",
list:[
{name:'wm',age:22,dec:{},a:[]},
{name:'zhangsan',age:21},
{name:'zhaosi',age:23}
]
},{
name:"张三",
list:[
{name:'nihao',age:22,dec:{},a:[]},
{name:'libai',age:21},
{name:'wangwu',age:23}
]
}
]
var res = deepCopy(data)
console.log(res)
去改变res的数据,看看源数据data有没有改变
res[0].name = "李白";
console.log("data",data,"res",res)
如图所示,数据源并没有改变