问题描述
我有2个变量x % n
和masterdata
。
datatoedit
具有数组值,masterdata
具有对象值。
我想将数据1从datatoedit
复制到变量masterdata
,所以我这样写:
datatoedit
但是当我编辑this.datatoedit = this.masterdata[0]
上表单数据上的datatoedit
中的数据时,也发生了变化。
在编辑masterdata[0]
时如何防止masterdata[0]
发生变化?
解决方法
您可以使用ES6 Spread syntax来制作对象副本:
this.datatoedit = {...this.masterdata[0]}
,
您也可以使用lodash函数clonedeep进行此操作。不会复制参考。
data_to_edit = _.cloneDeep(masterdata[0])
您现在可以根据需要修改data_to_edit。
,如果masterdata
元素具有嵌套对象,如
{
name: 'John',age: 30,address: {
street: 'ChurchStreet',city: 'Bangalore',state: 'KA'
}
}
var masterdata = [
{
name: 'John',address: {
street: 'ChurchStreet',state: 'KA'
}
},{
name: 'Jane',age: 26,address: {
street: 'West of Chord',city: 'Mumbai',state: 'MH'
}
}
];
// With spread operator
var datatoedit = {...masterdata[0]};
datatoedit.age = 32;
datatoedit.address.street = 'Infantry Road';
console.log('With spread operator');
console.log('masterdata[0]: ' + JSON.stringify(masterdata[0]));
console.log('datatoedit: ' + JSON.stringify(datatoedit));
// With Object.assign()
datatoedit = Object.assign({},masterdata[0]);
datatoedit.age = 35;
datatoedit.address.street = 'Brigade Road';
console.log('With Object.assign()');
console.log('masterdata[0]: ' + JSON.stringify(masterdata[0]));
console.log('datatoedit: ' + JSON.stringify(datatoedit));
// Now with JSON.parse() and JSON.stringify()
datatoedit = JSON.parse(JSON.stringify(masterdata[0]));
datatoedit.age = 35;
datatoedit.address.street = 'West of Chord Road';
console.log('With JSON.parse() and JSON.stringify()');
console.log('masterdata[0]: ' + JSON.stringify(masterdata[0]));
console.log('datatoedit: ' + JSON.stringify(datatoedit));
如您所见,在嵌套对象的情况下,散布运算符和Object.assign()都会因为进行浅表复制而出错。
结合使用JSON.parse()和JSON stringify()可以产生深度复制的效果,因此在所有情况下都可以正常工作。 (尽管这些功能并非旨在进行深层复制。)