Koji je najučinkovitiji način duboko klonirati objekt u javascript?

Koji je najučinkovitiji način kloniranja JavaScript objekta? Vidio sam obj = eval(uneval(o)); ali koji je nestandardan i podržava ga samo Firefox .

Učinio sam stvari poput obj = JSON.parse(JSON.stringify(o)); , ali sumnjam u učinkovitost.

Također sam vidio rekurzivne funkcije kopiranja s raznim nedostacima.

Iznenađen sam što ne postoji kanonsko rješenje.

4845
23 сент. postavila jschrab na 23 ruj . 2008-09-23 19:26 '08 u 19:26 2008-09-23 19:26
@ 69 odgovora
  • 1
  • 2
  • 3

Napomena: Ovo je odgovor na drugi odgovor, a ne na točan odgovor na ovo pitanje. Ako želite brzo klonirati objekte, slijedite savjete Corbana u odgovoru na ovo pitanje.


Želim napomenuti da .clone() metoda u jQuery samo klonira DOM elemente. Da biste klonirali JavaScript objekte, morate:

 // Shallow copy var newObject = jQuery.extend({}, oldObject); // Deep copy var newObject = jQuery.extend(true, {}, oldObject); 

Više informacija možete pronaći u dokumentaciji jQuery .

Također želim naglasiti da je duboka kopija zapravo mnogo pametnija od gore prikazane - može izbjeći mnoge zamke (na primjer, duboko proširiti DOM element). Često se koristi u jQuery jezgri iu dodatcima s velikim učinkom.

4203
23 сент. Odgovor dao je John Resig 23. rujna 2008-09-23 21:09 '08 u 21:09 2008-09-23 21:09

Pogledajte ovo mjerno mjerilo: http://jsben.ch/#/bWfk9

U mojim prethodnim testovima, gdje je brzina bila glavni problem, otkrio sam

<Prev> <code> JSON.parse (JSON.stringify (OBJ)) kod>

biti najbrži način za duboko kloniranje objekta (on nadilazi jQuery.extend s postavljenom dubokom zastavom od 10-20%).

jQuery.extend je prilično brz kada je zastavica duboke vrijednosti postavljena na false (plitak klon). Ovo je dobra opcija, jer uključuje dodatnu logiku za provjeru tipa i ne kopira svojstva nedefiniranih, itd. Ali to će vas i malo usporiti.

Ako znate strukturu objekata koje pokušavate klonirati ili možete izbjeći duboko uklopljene nizove, možete napisati jednostavnu petlju for (var я in obj) za kloniranje objekta, provjeru hasOwnProperty i bit će mnogo brži od jQuery.

border=0

Konačno, ako pokušavate klonirati poznatu strukturu objekta u vrućoj petlji, možete dobiti mnogo više performansi jednostavnim umetanjem postupka kloniranja i ručnim kreiranjem objekta.

JavaScript mehanizmi za praćenje usisavaju optimizaciju za for..in petljama i provjera hasOwnProperty također će vas usporiti. Ručno kloniranje kada je brzina apsolutno nužna.

  var clonedObject = { knownProp: obj.knownProp,.. } Код> 

Čuvajte se upotrebe JSON.parse(JSON.stringify(obj)) metode JSON.parse(JSON.stringify(obj)) za objekte Date - JSON.stringify(новая дата()) vraća string prikaz datuma u ISO formatu, u kojem se JSON.parse() ne vraća na objekt Date . Pogledajte ovaj odgovor za više detalja .

Osim toga, imajte na umu da u krom 65 barem nativno kloniranje nije prikladno. Prema ovom JSPerf-u , izvođenje vlastitog kloniranja stvaranjem nove funkcije gotovo je 800x sporije nego korištenjem JSON.stringify, koji prolazi nevjerojatno brzo kroz cijelu ploču.

2046
17 марта '11 в 22:19 2011-03-17 22:19 odgovor je dao Corban Brook 17. ožujka 2011. u 22:19 sati 2011-03-17 22:19

Pod pretpostavkom da imate samo varijable, a ne bilo koje funkcije u vašem objektu, možete jednostavno koristiti:

 var newObject = JSON.parse(JSON.stringify(oldObject)); 
431
04 янв. Odgovor daje sultan Shakir 04. siječnja 2011-01-04 11:05 '11 u 11:05 2011-01-04 11:05

Strukturirano kloniranje

HTML standard uključuje unutarnji strukturirani algoritam kloniranja / serijalizacije koji može stvoriti duboke klonove objekata. To je još uvijek ograničena na određene ugrađene vrste, ali uz nekoliko tipova koje podržava JSON, ona također podržava Datume, RegExps, Karte, Setove, Blobs, FileList, ImageDatas, rijetke nizove, Typed Arrays, a možda i više u budućnosti. Također, pohranjuje reference u kloniranim podacima, što vam omogućuje održavanje cikličkih i rekurzivnih struktura koje mogu uzrokovati pogreške za JSON.

Podrška u Node.js: experimental 🙂

v8 modul u Node.js trenutno (od Node 11) izravno osigurava strukturirani API za serijalizaciju , ali je ova funkcionalnost još uvijek označena kao "eksperimentalna" i može se promijeniti ili ukloniti u budućim verzijama. Ako koristite kompatibilnu verziju, kloniranje objekta je jednostavno:

structdClone structuredClone() raspravljalo u whatwg / html # 793 na GitHubu .  Trenutno se predlaže da se koristi za većinu namjena jednostavno kao: 

MessageChannels .  Drugi port će poslati događaj s message strukturiranog kloniranog podatka .data .  Nažalost, slušanje tih događaja nužno je asinkrono, a sinkrone alternative su manje praktične. 

 const main = async () => { const original = { date: new Date(), number: Math.random() }; original.self = original; const clone = await structuredCloneAsync(original); // They're different objects: console.assert(original !== clone); console.assert(original.date !== clone.date); // They're cyclical: console.assert(original.self === original); console.assert(clone.self === clone); // They contain equivalent values: console.assert(original.number === clone.number); console.assert(Number(original.date) === Number(clone.date)); console.log("Assertions complete."); }; main(); 

Sinkrono zaobilazno rješenje: Užasno! 🤢

Nema dobrih opcija za sinkrono stvaranje strukturiranih klonova. Evo nekoliko nepraktičnih hakova umjesto toga.

history.pushState() i history.replaceState() stvaraju strukturirani klon svog prvog argumenta i dodjeljuju tu vrijednost history.state . Ovo možete upotrijebiti za stvaranje strukturiranog klona bilo kojeg objekta poput ovog:

Notification stvara strukturirani klon svojih pridruženih podataka.  Također pokušava prikazati obavijest u pregledniku za korisnika, ali to će se tiho završiti pogreškom ako niste zatražili dopuštenje za obavijest.  Ako imate dopuštenje za druge svrhe, odmah ćemo zatvoriti obavijest koju smo stvorili. 

306
06 июня '12 в 17:59 2012-06-06 17:59 odgovor je dao Jeremy Banks Lipanj 06 '12 u 17:59 2012-06-06 17:59

Ako nije ugrađena, pokušajte:

 function clone(obj) { if (obj === null || typeof (obj) !== 'object' || 'isActiveClone' in obj) return obj; if (obj instanceof Date) var temp = new obj.constructor(); //or new Date(obj); else var temp = obj.constructor(); for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { obj['isActiveClone'] = null; temp[key] = clone(obj[key]); delete obj['isActiveClone']; } } return temp; } 
294
23 сент. Odgovor dao ConroyP 23. rujna 2008-09-23 19:38 '08 u 19:38 2008-09-23 19:38

Učinkovit način za kloniranje (ne duboko kloniranje) objekta u jedan redak koda

Metoda Object.assign dio je standarda ECMAScript 2015 (ES6) i čini upravo ono što vam je potrebno.

 var clone = Object.assign({}, obj); 

Metoda Object.assign () se koristi za kopiranje vrijednosti svih nabrojanih ispravnih svojstava iz jednog ili više izvornih objekata u ciljni objekt.

Pročitajte više ...

polyfill za podršku starijim preglednicima:

 if (!Object.assign) { Object.defineProperty(Object, 'assign', { enumerable: false, configurable: true, writable: true, value: function(target) { 'use strict'; if (target === undefined || target === null) { throw new TypeError('Cannot convert first argument to object'); } var to = Object(target); for (var i = 1; i < arguments.length; i++) { var nextSource = arguments[i]; if (nextSource === undefined || nextSource === null) { continue; } nextSource = Object(nextSource); var keysArray = Object.keys(nextSource); for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) { var nextKey = keysArray[nextIndex]; var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); if (desc !== undefined  desc.enumerable) { to[nextKey] = nextSource[nextKey]; } } } return to; } }); } 
148
15 дек. Odgovor daje Eugene Tiurin 15. prosinca. 2015-12-15 10:26 '15 u 10:26 sati 2015-12-15 10:26

šifra:

 // extends 'from' object with members from 'to'. If 'to' is null, a deep clone of 'from' is returned function extend(from, to) { if (from == null || typeof from != "object") return from; if (from.constructor != Object  from.constructor != Array) return from; if (from.constructor == Date || from.constructor == RegExp || from.constructor == Function || from.constructor == String || from.constructor == Number || from.constructor == Boolean) return new from.constructor(from); to = to || new from.constructor(); for (var name in from) { to[name] = typeof to[name] == "undefined" ? extend(from[name], null) : to[name]; } return to; } 

Test:

 var obj = { date: new Date(), func: function(q) { return 1 + q; }, num: 123, text: "asdasd", array: [1, "asd"], regex: new RegExp(/aaa/i), subobj: { num: 234, text: "asdsaD" } } var clone = extend(obj); 
94
25 июня '09 в 10:53 2009-06-25 10:53 odgovor je dao Kamarey 25. lipnja 2009. u 10:53 2009-06-25 10:53

To je ono što koristim:

 function cloneObject(obj) { var clone = {}; for(var i in obj) { if(typeof(obj[i])=="object"  obj[i] != null) clone[i] = cloneObject(obj[i]); else clone[i] = obj[i]; } return clone; } 
86
12 дек. Odgovor je dao Alan 12. prosinca. 2009-12-12 01:47 '09 u 1:47 2009-12-12 01:47

Dubina kopiranja: od najboljeg do najgoreg

  • Preraspodjela "=" (nizovi nizova, numerički nizovi - samo)
  • Slice (nizovi nizova, nizovi brojeva)
  • Povezivanje (samo nizovi nizova, numerički nizovi)
  • Prilagođena funkcija: for-loop ili rekurzivna kopija
  • jQuery $ .extend
  • JSON.parse (samo nizovi nizova, nizovi brojeva, nizovi objekata)
  • Underscore.js _.clone (samo nizovi nizova, numerički nizovi)
  • Lo-crtica _.cloneDeep

Duboko kopirajte niz nizova ili brojeva (jedna razina - bez pokazivača):

Kada niz sadrži brojeve i nizove - funkcije kao što su .slice (), Concat (), .plice (), operator dodjeljivanja "=" i funkcija kloniranja Underscore.js; napraviti duboku kopiju elemenata niza.

Ako preraspodjela ima najvišu izvedbu:

 var arr1 = ['a', 'b', 'c']; var arr2 = arr1; arr1 = ['a', 'b', 'c']; 

I.slice () ima bolje rezultate od .concat (), http://jsperf.com/duplicate-array-slice-vs-concat/3

 var arr1 = ['a', 'b', 'c']; // Becomes arr1 = ['a', 'b', 'c'] var arr2a = arr1.slice(0); // Becomes arr2a = ['a', 'b', 'c'] - deep copy var arr2b = arr1.concat(); // Becomes arr2b = ['a', 'b', 'c'] - deep copy 

Duboko kopirajte niz objekata (dva ili više pokazivača):

 var arr1 = [{object:'a'}, {object:'b'}]; 

Napišite prilagođenu funkciju (ima bolju izvedbu od $ .extend () ili JSON.parse):

 function copy(o) { var out, v, key; out = Array.isArray(o) ? [] : {}; for (key in o) { v = o[key]; out[key] = (typeof v === "object"  v !== null) ? copy(v) : v; } return out; } copy(arr1); 

Koristite funkcije pomoćnih programa trećih strana:

 $.extend(true, [], arr1); // Jquery Extend JSON.parse(arr1); _.cloneDeep(arr1); // Lo-dash 

Gdje jQuery $ .extend ima bolje performanse:

71
18 сент. Odgovor je dat na vrijeme 18 sep . 2014-09-18 23:10 '14 u 23:10 2014-09-18 23:10
 var clone = function() { var newObj = (this instanceof Array) ? [] : {}; for (var i in this) { if (this[i]  typeof this[i] == "object") { newObj[i] = this[i].clone(); } else { newObj[i] = this[i]; } } return newObj; }; Object.defineProperty( Object.prototype, "clone", {value: clone, enumerable: false}); 
60
26 дек. odgovor je dao Zibri 26. prosinca. 2009-12-26 17:59 '09 u 17:59 2009-12-26 17:59

Znam da je ovo stara pošta, ali mislio sam da bi to moglo pomoći nekome tko se spotakne.

Sve dok ne dodijelite objekt nečemu, ne održava referencu u memoriji. Stoga, da biste stvorili objekt koji želite dijeliti s drugim objektima, morate stvoriti tvornicu na sljedeći način:

 var a = function(){ return { father:'zacharias' }; }, b = a(), c = a(); c.father = 'johndoe'; alert(b.father); 
53
24 сент. odgovor Joea 24. rujna. 2011-09-24 22:28 '11 u 22:28 2011-09-24 22:28

Cloning objekta je oduvijek bio predmetom zabrinutosti u JS-u, ali sve je to bilo prije ES6, a ja sam nabrojao različite načine kopiranja objekta u JavaScript u nastavku, zamislite da imate objekt ispod i želite imati duboku kopiju toga:

 var obj = {a:1, b:2, c:3, d:4}; 

Postoji nekoliko načina za kopiranje ovog objekta bez promjene izvora:

1) ES5 + pomoću jednostavne funkcije za kopiranje:

 function deepCopyObj(obj) { if (null == obj || "object" != typeof obj) return obj; if (obj instanceof Date) { var copy = new Date(); copy.setTime(obj.getTime()); return copy; } if (obj instanceof Array) { var copy = []; for (var i = 0, len = obj.length; i < len; i++) { copy[i] = cloneSO(obj[i]); } return copy; } if (obj instanceof Object) { var copy = {}; for (var attr in obj) { if (obj.hasOwnProperty(attr)) copy[attr] = cloneSO(obj[attr]); } return copy; } throw new Error("Unable to copy obj this object."); } 

2) ES5 + pomoću JSON.parse i JSON.stringify.

 var deepCopyObj = JSON.parse(JSON.stringify(obj)); 

3) AngularJs:

 var deepCopyObj = angular.copy(obj); 

4) jQuery:

 var deepCopyObj = jQuery.extend(true, {}, obj); 

5) Donje crte i Loadash:

 var deepCopyObj = _.cloneDeep(obj); //latest version UndescoreJs makes shallow copy 

Nadam se ovo pomoći ...

52
03 апр. Odgovor je dan Alireza 03 Apr. 2017-04-03 18:37 '17 u 18:37 2017-04-03 18:37

Tu je knjižnica (koja se zove "klon") , što je čini prilično dobrom. On pruža najkompletnije rekurzivno kloniranje / kopiranje proizvoljnih objekata o kojima znam. Također podržava i kružne veze koje još nisu obuhvaćene drugim odgovorima.

Možete ga pronaći na npm . Može se koristiti i za preglednik i za Node.js.

Evo primjera kako ga koristiti:

Instalirajte ga s

 npm install clone 

ili pak s Enderom .

 ender build clone [...] 

Izvorni kod možete preuzeti i ručno.

Tada je možete koristiti u izvornom kodu.

 var clone = require('clone'); var a = { foo: { bar: 'baz' } }; // inital value of a var b = clone(a); // clone a -> b a.foo.bar = 'foo'; // change a console.log(a); // { foo: { bar: 'foo' } } console.log(b); // { foo: { bar: 'baz' } } 

(Odricanje od odgovornosti: Ja sam autor knjižnice.)

51
17 окт. odgovor se daje pvorb 17 okt. 2012-10-17 21:36 '12 u 21:36 2012-10-17 21:36

Ako ga koristite, knjižnica Underscore.js ima klon .

 var newObject = _.clone(oldObject); 
48
15 дек. odgovor s obzirom na svoj dan 15. 2011-12-15 18:56 '11 u 18:56 2011-12-15 18:56

Ovdje je gore navedena verzija programa ConroyP, koja radi čak i ako dizajner zahtijeva parametre:

 //If Object.create isn't already defined, we just do the simple shim, //without the second argument, since that all we need here var object_create = Object.create; if (typeof object_create !== 'function') { object_create = function(o) { function F() {} F.prototype = o; return new F(); }; } function deepCopy(obj) { if(obj == null || typeof(obj) !== 'object'){ return obj; } //make sure the returned object has the same prototype as the original var ret = object_create(obj.constructor.prototype); for(var key in obj){ ret[key] = deepCopy(obj[key]); } return ret; } 

Ova značajka je također dostupna u mojoj simpleoo knjižnici.

Uredi:

Evo pouzdanije verzije (zahvaljujući Justinu McCandlesu, sada podržava kružne reference):

  function deepCopy(src,  _visited, _copiesVisited) { if(src === null || typeof(src) !== 'object'){ return src; } //Honor native/custom clone methods if(typeof src.clone == 'function'){ return src.clone(true); } //Special cases: //Date if(src instanceof Date){ return new Date(src.getTime()); } //RegExp if(src instanceof RegExp){ return new RegExp(src); } //DOM Element if(src.nodeType  typeof src.cloneNode == 'function'){ return src.cloneNode(true); } // Initialize the visited objects arrays if needed. // This is used to detect cyclic references. if (_visited === undefined){ _visited = []; _copiesVisited = []; } // Check if this object has already been visited var i, len = _visited.length; for (i = 0; i < len; i++) { // If so, get the copy we already made if (src === _visited[i]) { return _copiesVisited[i]; } } //Array if (Object.prototype.toString.call(src) == '[object Array]') { //[].slice() by itself would soft clone var ret = src.slice(); //add it to the visited array _visited.push(src); _copiesVisited.push(ret); var i = ret.length; while (i--) { ret[i] = deepCopy(ret[i], _visited, _copiesVisited); } return ret; } //If we've reached here, we have a regular object //make sure the returned object has the same prototype as the original var proto = (Object.getPrototypeOf ? Object.getPrototypeOf(src): src.__proto__); if (!proto) { proto = src.constructor.prototype; //this line would probably only be reached by very old browsers } var dest = object_create(proto); //add this object to the visited array _visited.push(src); _copiesVisited.push(dest); for (var key in src) { //Note: this does NOT preserve ES5 property attributes like 'writable', 'enumerable', etc. //For an example of how this could be modified to do so, see the singleMixin() function dest[key] = deepCopy(src[key], _visited, _copiesVisited); } return dest; } //If Object.create isn't already defined, we just do the simple shim, //without the second argument, since that all we need here var object_create = Object.create; if (typeof object_create !== 'function') { object_create = function(o) { function F() {} F.prototype = o; return new F(); }; } 
36
11 нояб. Odgovor je dao Matt Browne 11. studenog. 2012-11-11 20:53 '12 u 20:53 2012-11-11 20:53

Sljedeće stvara dvije instance istog objekta. Našao sam ga i sada ga koristim. Jednostavan je i jednostavan za korištenje.

 var objToCreate = JSON.parse(JSON.stringify(cloneThis)); 
31
21 авг. Odgovor dao nathan rogers 21. kolovoza 2015-08-21 18:51 '15 u 18:51 2015-08-21 18:51

Duboko kopiranje objekata u javascriptu (mislim da je najbolje i najlakše)

1. Korištenje JSON.parse (JSON.stringify (objekt));

 var obj = { a: 1, b: { c: 2 } } var newObj = JSON.parse(JSON.stringify(obj)); obj.bc = 20; console.log(obj); // { a: 1, b: { c: 20 } } console.log(newObj); // { a: 1, b: { c: 2 } } 

2. Korištenje stvorene metode

 function cloneObject(obj) { var clone = {}; for(var i in obj) { if(obj[i] != null  typeof(obj[i])=="object") clone[i] = cloneObject(obj[i]); else clone[i] = obj[i]; } return clone; } var obj = { a: 1, b: { c: 2 } } var newObj = cloneObject(obj); obj.bc = 20; console.log(obj); // { a: 1, b: { c: 20 } } console.log(newObj); // { a: 1, b: { c: 2 } } 

3. Koristeći Lo-Dash _.cloneDeep link lodash

 var obj = { a: 1, b: { c: 2 } } var newObj = _.cloneDeep(obj); obj.bc = 20; console.log(obj); // { a: 1, b: { c: 20 } } console.log(newObj); // { a: 1, b: { c: 2 } } 

4. Korištenje Object.assign ()

 var obj = { a: 1, b: 2 } var newObj = _.clone(obj); obj.b = 20; console.log(obj); // { a: 1, b: 20 } console.log(newObj); // { a: 1, b: 2 } 

ALI POGREŠNO KADA

 var obj = { a: 1, b: { c: 2 } } var newObj = Object.assign({}, obj); obj.bc = 20; console.log(obj); // { a: 1, b: { c: 20 } } console.log(newObj); // { a: 1, b: { c: 20 } } --> WRONG // Note: Properties on the prototype chain and non-enumerable properties cannot be copied. 

5. Korištenje Underscore.js _.clone veze Underscore.js

 var obj = { a: 1, b: 2 } var newObj = _.clone(obj); obj.b = 20; console.log(obj); // { a: 1, b: 20 } console.log(newObj); // { a: 1, b: 2 } 

ALI POGREŠNO KADA

 var obj = { a: 1, b: { c: 2 } } var newObj = _.cloneDeep(obj); obj.bc = 20; console.log(obj); // { a: 1, b: { c: 20 } } console.log(newObj); // { a: 1, b: { c: 20 } } --> WRONG // (Create a shallow-copied clone of the provided plain object. Any nested objects or arrays will be copied by reference, not duplicated.) 

Link medium.com

JSBEN.CH igralište za mjerenje performansi 1 ~ 3 http://jsben.ch/KVQLd 2019

08 авг. odgovor je dan TinhNQ 08 aug. 2018-08-08 11:17 '18 u 11:17 ; 2018-08-08 11:17

Lodash ima dobru metodu . cloneDeep (vrijednost) :

 var objects = [{ 'a': 1 }, { 'b': 2 }]; var deep = _.cloneDeep(objects); console.log(deep[0] === objects[0]); // => false 
23
22 июня '13 в 18:03 2013-06-22 18:03 odgovor je dao opensas 22. lipnja '13 u 18:03 2013-06-22 18:03

Crockford predlaže (a ja više volim) koristiti ovu značajku:

 function object(o) { function F() {} F.prototype = o; return new F(); } var newObject = object(oldObject); 

Kratak je, djeluje kako se očekuje, a ne trebate knjižnicu.


EDIT:

Ovo je polifil za Object.create , tako da ga također možete koristiti.

 var newObject = Object.create(oldObject); 

NAPOMENA. , Ako koristite neke od njih, možda imate problema s nekom iteracijom koja koristi hasOwnProperty . Zato što kreira novi prazni objekt koji nasljeđuje oldObject . Ali to je još uvijek korisno i praktično za kloniranje objekata.

Na primjer, ako oldObject.a = 5;

 newObject.a; // is 5 

i

 oldObject.hasOwnProperty(a); // is true newObject.hasOwnProperty(a); // is false 
23
06 окт. odgovor dao Chris Broski Listopad 06 2010-10-06 18:08 '10 u 18:08 2010-10-06 18:08
 function clone(obj) { var clone = {}; clone.prototype = obj.prototype; for (property in obj) clone[property] = obj[property]; return clone; } 
22
23 сент. Odgovor dao je Mark Cidade 23. rujna 2008-09-23 19:45 '08 u 19:45 2008-09-23 19:45

Jedna linija kopije plitke kopije ( ECMAScript 5. izdanje ):

 var origin = { foo : {} }; var copy = Object.keys(origin).reduce(function(c,k){c[k]=origin[k];return c;},{}); console.log(origin, copy); console.log(origin == copy); // false console.log(origin.foo == copy.foo); // true 

Pojedinačna i mala kopija ( ECMAScript 6. izdanje , 2015):

 var origin = { foo : {} }; var copy = Object.assign({}, origin); console.log(origin, copy); console.log(origin == copy); // false console.log(origin.foo == copy.foo); // true 
20
05 июля '12 в 0:44 2012-07-05 00:44 odgovor je dao maël nison 5. srpnja '12 u 0:44 2012-07-05 00:44

Просто потому, что я не видел AngularJS и думал, что люди захотят узнать...

angular.copy также предоставляет метод глубокого копирования объектов и массивов.

17
ответ дан Dan Atkinson 14 мая '16 в 1:16 2016-05-14 01:16