87

Please help me in order to copy the object into another object using angular 2?

In angular, I used angular.copy() to copy objects to the loose reference of the old objects. But, when I used the same in angular 2 getting below error:

Error: angular is not defined.

CodeChanger
  • 7,953
  • 5
  • 49
  • 80
Swetha
  • 1,079
  • 2
  • 10
  • 11
  • 3
    Possible duplicate of [How can I use angular.copy in angular 2](https://stackoverflow.com/questions/34688517/how-can-i-use-angular-copy-in-angular-2) – sisve Nov 30 '17 at 07:30

10 Answers10

190

Solution

Angular2 developed on the ground of modern technologies like TypeScript and ES6.

So you can just do let copy = Object.assign({}, myObject).

Object assign - nice examples.

For nested objects : let copy = JSON.parse(JSON.stringify(myObject))

jakubde
  • 31
  • 1
  • 2
  • 4
Kanso Code
  • 7,479
  • 5
  • 34
  • 49
60
let copy = Object.assign({}, myObject).  as mentioned above

but this wont work for nested objects. So an alternative would be

let copy =JSON.parse(JSON.stringify(myObject))
Ankit Raonka
  • 6,429
  • 10
  • 35
  • 54
14

As suggested before, the clean way of deep copying objects having nested objects inside is by using lodash's cloneDeep method.

For Angular, you can do it like this:

Install lodash with yarn add lodash or npm install lodash.

In your component, import cloneDeep and use it:

import * as cloneDeep from 'lodash/cloneDeep';
...
clonedObject = cloneDeep(originalObject);

It's only 18kb added to your build, well worth for the benefits.

I've also written an article here, if you need more insight on why using lodash's cloneDeep.

BogdanC
  • 2,746
  • 2
  • 24
  • 22
  • 1
    That works for me! Thank you :) It seems incredible that high level programming language cannot deal with a "copy" without reference... – Nebuchanazer Mar 26 '20 at 19:01
11

You can do in this in Angular with ECMAScript6 by using the spread operator:

let copy = {...myObject};
Kabb5
  • 3,760
  • 2
  • 33
  • 55
5
let course = {
  name: 'Angular',
};

let newCourse= Object.assign({}, course);

newCourse.name= 'React';

console.log(course.name); // writes Angular
console.log(newCourse.name); // writes React

For Nested Object we can use of 3rd party libraries, for deep copying objects. In case of lodash, use _.cloneDeep()

let newCourse= _.cloneDeep(course);
rajesh kumar
  • 1,578
  • 16
  • 14
4

Try this.

Copy an Array :

const myCopiedArray  = Object.assign([], myArray);

Copy an object :

const myCopiedObject = Object.assign({}, myObject);
Saif
  • 394
  • 3
  • 13
2

Loadsh is the universal standard library for coping any object deepcopy. It's a recursive algorithm. It's check everything and does copy for the given object. Writing this kind of algorithm will take longer time. It's better to leverage the same.

2

Object.assign will only work in single level of object reference.

To do a copy in any depth use as below:

let x = {'a':'a','b':{'c':'c'}};
let y = JSON.parse(JSON.stringify(x));

If want to use any library instead then go with the loadash.js library.

Mike Poole
  • 1,958
  • 5
  • 29
  • 41
1

You can now do deep copy without any external library as below:

let originalObj = {'a':'a','b':{'c':'c'}};
let copyObj = structuredClone(originalObj);

Complete Reference MDN

0

thank you Saif from above. I tried his suggestion and it worked like a charm after I tried for three days to get my code to work.

  this.sElectionFinal.subscribe((election) => {
 const electionCopy = Object.assign({},election)
  this.electionsFinal.push(electionCopy)})