I have an array of objects. I would like to deep copy the array of objects and make some changes to each object. I want to do this without modifying the original array or original objects that were in that array.
This is the way I have done it. However, being new to JavaScript I want to make sure this is a good approach.
Is there a better way to do this?
const users =
[
{
id : 1,
name : 'Jack',
approved : false
},
{
id : 2,
name : 'Bill',
approved : true
},
{
id : 3,
name : 'Rick',
approved : false
},
{
id : 4,
name : 'Rick',
approved : true
}
];
const users2 =
users
.map(
(u) =>
{
return Object.assign({}, u);
}
)
.map(
(u) =>
{
u.approved = true;
return u;
}
);
console.log('New users2 array of objects:')
console.log(users2);
console.log('This was original users array is untouched:')
console.log(users);
Output:
New users2 array of objects:
[ { id: 1, name: 'Jack', approved: true },
{ id: 2, name: 'Bill', approved: true },
{ id: 3, name: 'Rick', approved: true },
{ id: 4, name: 'Rick', approved: true } ]
This was original users array is untouched:
[ { id: 1, name: 'Jack', approved: false },
{ id: 2, name: 'Bill', approved: true },
{ id: 3, name: 'Rick', approved: false },
{ id: 4, name: 'Rick', approved: true } ]
I prefer JSON.stringify and JSON.parse
For a single pass, you could use
Object.assign
with the changed property as well.Yes that looks good. You could also perform the modification when you are cloning, in order to avoid mapping over the array twice.
There are a few ways to copy a array in javascript, i believed that the most used are:
The slice function will return a portion (or all content) of a given array as a new array, based at a begin and end index (begin and end index are optional):
Array.from() is a function that will create a new array from an array-like or iterable parameters.
More about slice
More about Array.from()