最近在做ionic3的项目时,遇到了一个复杂对象被赋值给多个变量,其中一个变量修改后,导致所有其他变量都跟着改变了的情况。
这个其实在javascript中就存在的一个问题,在typescript中也是存在的。虽然typescript针对深度拷贝提供了一个Object.assign(target, ...source)方法来解决,但是对于嵌套的情况缺比较无力。于是笔者在综合了网上各位大佬的方案后做了一个如下的函数,该函数针对数组和一般的json复杂对象亲测有效。至于其他情况目前还没考虑到,如果有谁遇到并解决了希望能分享下,谢谢了先。
下面上代码:
//深度拷贝json对象的函数,
//source:待拷贝对象
//返回一个新的对象
DeepCopy(source: Object): any
{
if(null == source || {} == source || [] == source)
{
return source;
}
let newObject : any;
let isArray = false;
if((source as any).length)
{
newObject = [];
isArray = true;
}
else
{
newObject = {};
isArray = false;
}
for (let key of Object.keys(source))
{
if(null == source[key])
{
if (isArray)
{
newObject.push(null);
}
else
{
newObject[key] = null;
}
}
else
{
let sub = (typeof source[key] == 'object') ? this.DeepCopy(source[key]) : source[key];
if(isArray)
{
newObject.push(sub);
}
else
{
newObject[key] = sub;
}
}
}
return newObject;
}
另外从一个网上看到一个比较简洁的方法:
let obj3 = JSON.parse(JSON.stringify(obj1));
再次感谢网上的大佬们的分享,参考文档: