4

I have two array called 'persons' and 'persons2', The 'persons2' array would to be copy of 'persons' array, But the problem is when I copy it, and I want to change the second array, the first array is also changing. This is my code:

  export class AppComponent {

  persons = [
    {
      name:'David',
      lname:'Jeu'
    }
  ];

  persons2=[...this.persons];

  constructor(){
      console.log(this.persons[0]);
      this.persons2[0].name='Drake';
      console.log(this.persons[0]);

      console.log(this.persons2[0]);
  }

}
1
  • 1
    Duplicate with every other question here... Commented Jul 28, 2018 at 17:18

3 Answers 3

8

But the problem is when I copy it, and I want to change the second array, the first array is also changing

That is because the objects inside both the arrays are sharing same reference. To perform a deep copy try the following :

let persons2 = person.map(x => Object.assign({}, x));

Or

let person2 = JSON.parse(JSON.stringify(person));
Sign up to request clarification or add additional context in comments.

5 Comments

Thanks it's working, But why this code does not work? persons2=[...this.persons];
@Jack That is because the objects inside person and person2 are sharing same reference. So changes made in one will be reflected in other.
I did :) . I am watching this youtube tutorial: youtube.com/watch?v=1tRLveSyNz8 , on 2:07:00 He did the same like me, and it worked for him. Can you explain me please?
@Jack sure would love to :-)
@Jack please move a further in video the guide has mentioned that add and remove operation on the new "Array" will not be reflected in the old array. But the existing objects in the new Array and old array remains same.That is in your case if you add/remove an object in person2 two array it will not be added/removed from person array.
1

In your case both the array is referring to the same memory, which is commonly known as shallow copy.

enter image description here

You can make a deep copy of the first array and then change the second array. That will have no impact on the first array.

let persons = [{
  name: 'David',
  lname: 'Jeu'
}];

let persons2 = JSON.parse(JSON.stringify(persons));
persons2[0].age = 29;

console.log(persons)
console.log(persons2)

Comments

1

For these kinds of operations it is usually wise using Lodash Clonedeep

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.