The accepted answer can go wrong if the masterdata
elements have nested objects like
{
name: 'John',
age: 30,
address: {
street: 'ChurchStreet',
city: 'Bangalore',
state: 'KA'
}
}
var masterdata = [
{
name: 'John',
age: 30,
address: {
street: 'ChurchStreet',
city: 'Bangalore',
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));
As you can see, in case of nested objects, both spread operator and Object.assign() can go wrong as they do shallow copy.
Combining JSON.parse() and JSON stringify() creates the effect of deep copy and hence it works fine all cases. (Though these functions are not meant for deep copy as such).