2016-03-21 14 views
26

AngularJS ma angular.copy() do głębokiego kopiowania obiektów i tablic.Obiekty głębokiego kopiowania w Angular

Czy Angular ma coś takiego?

+5

Prawdopodobny duplikat [Jak mogę użyć angular.copy w kanciastym 2] (http://stackoverflow.com/questions/34688517/how-can-i-property- -copy-copy-inline- 2) –

+0

'Duplicate' może, ale chciałem rozwiązanie' non-polyfill'. tak jak 'angular.copy()' –

+0

To wszystko, co mamy. –

Odpowiedz

12

To pytanie nie jest duplikatem How can I use angular.copy in angular 2, ponieważ PO pyta o kopiowanie głęboko obiektów. Połączona odpowiedź rekomenduje Object.assign(), która nie tworzy głębokiej kopii.

Faktycznie, używając Angular2 nie ograniczają możliwość korzystania z innych bibliotek jak jQuery do głębokiego kopiowania obiektów z ich $.clone() funkcji lub lodash z _.cloneDeep().

Najbardziej powszechne biblioteki mają swoje typowania dostępne za pomocą narzędzi CLI typings, więc nawet przy transporcie z TypeScript możesz bezproblemowo używać czegokolwiek, co chcesz.

zobacz także: What is the most efficient way to deep clone an object in JavaScript?

16

Inną opcją jest zaimplementować własną funkcję:

/** 
* Returns a deep copy of the object 
*/ 
public static deepCopy(oldObj: any) { 
    var newObj = oldObj; 
    if (oldObj && typeof oldObj === "object") { 
     newObj = Object.prototype.toString.call(oldObj) === "[object Array]" ? [] : {}; 
     for (var i in oldObj) { 
      newObj[i] = this.deepCopy(oldObj[i]); 
     } 
    } 
    return newObj; 
} 
+1

Nie mogę podać dokładnych dat kopiowania przy użyciu tej metody. –

7

Można również użyć:

JSON.parse(JSON.stringify(Object))

czy to na swoim zakresem, to w każdy element Angular, dyrektywę itp., a także w każdym środowisku węzła.

O ile nie ma odniesienia cyklicznego, to powinno działać i skutecznie oddzielić odniesienie do zmiennej do oryginalnego obiektu.

+0

Wydaje się to bardzo prostą i skuteczną głęboką kopią! Dlaczego nie ma wyższego wyniku? Czy coś jest nie tak z tą odpowiedzią? – TSG

+0

W przypadku rozwiązania do głębokiego kopiowania, które usunie wszystkie odniesienia, jest to najlepsza metoda dostępna w przeglądarce/CommonJS itp. Używam jej w produkcji, gdy potrzebna jest migawka obiektu. Sądzę, że przybyłem odpowiedzieć trochę późno, jak 1 rok za późno. @TSG –

+0

Ponadto, jeśli używasz literału obiektowego z funkcjami na nim (nie tylko wartościami), zostaną one pominięte, ale możesz łatwo połączyć 'Obiekt.assing ({}, oldObject, JSON.parse (JSON.stringify (oldObject))) 'a to spowoduje ponowne wypełnienie właściwości funkcji z literału obiektu i JSON utworzy głęboką kopię bez żadnego związku z oryginałem. –

0

Można deep copy obiekt w kątowa stosując metodę cloneDeep lodash za:

Install lodash z yarn add lodash lub npm install lodash.

W komponentu, importować cloneDeep i używać go:

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

to tylko 18KB dodany do budowy, warto za korzyści.

Napisałem również article here, jeśli potrzebujesz więcej informacji na temat używania cloneDeep lodasha.

Powiązane problemy