2016-12-15 29 views
1

我试图克隆和对象,然后对原始对象进行更改并做一些测试包装测试失败恢复克隆回来。在JavaScript中克隆一个对象的解耦版本

目前我已经试过_.clone(下划线),angular.extendangular.mergeangular.copyObject.createObject.assignJSON.parse(JSON.stringify(o)),但不知何故,我在原来的对象改变被反射回克隆。

+0

也许你需要[深克隆(http://stackoverflow.com/questions/4459928/how-对深克隆中的JavaScript)? – Paulpro

+0

'_.clone'是对象的浅表副本,但您需要深度复制。改为使用'_.cloneDeep'。 –

+0

不幸的是,我们不使用lodash,我试图使用等效角度,但所有这些都反映了变化 – Ash

回答

1

您可以使用Object.assign在vanilla JavaScript中浅拷贝对象。

// Shallow copy an object in vanilla JS 
 
let oldObj = { 
 
    name: 'Joe', 
 
    favColor: 'Green', 
 
} 
 

 
// Shallow copy oldObj to the newObj using assign 
 
var newObj = Object.assign({}, oldObj); 
 

 
// Changes made to the new object are not reflected in the new object 
 
newObj.favFood = 'pizza'; 
 
console.log(oldObj.favFood); // undefined

要执行 “深拷贝”,你可以使用JSON.parse(JSON.stringify(a))

let oldObj = { 
 
    name: 'Joe', 
 
    favColor: 'Green', 
 
    favPizza: { 
 
    cheese: true, 
 
    pepperoni: false, 
 
    }, 
 
}; 
 

 
// Deep copy an object using JSON.parse(JSON.stringify(a)) 
 
let newObj = JSON.parse(JSON.stringify(oldObj)); 
 

 
// Changes made to the new object are not reflected in the new object 
 
newObj.favPizza.sausage = true; 
 
console.log(oldObj.favPizza.sausage); //undefined

参考:

+0

我做过{originalPizza:Object.assign({},pizza)},但是当我对披萨配料进行更改时,它变成了原来的比萨。 – Ash

+0

@ArashKiani - 我添加了一个执行“浅拷贝”和“深拷贝”。我希望它有帮助! –