Vairāk
Kāds ir visefektīvākais veids, kā dziļi klonēt objektu JavaScript programmā?
Kāds ir efektīvākais veids, kā klonēt JavaScript objektu? Esmu redzējis, ka tiek izmantots obj = eval(uneval(o));
, bet tas ir nestandarta un to atbalsta tikai Firefox.
Es'esmu darījis tādas lietas kā obj = JSON.parse(JSON.stringify(o));
, bet šaubos par efektivitāti.
Es'esmu redzējis arī rekursīvas kopēšanas funkcijas ar dažādiem trūkumiem.
Es'esmu pārsteigts, ka nav kanoniska risinājuma.
5181
3
Native deep cloning
To sauc par "strukturētu klonēšanu", eksperimentāli tas darbojas Node 11 un jaunākajās versijās un, cerams, tiks ieviests pārlūkprogrammās. Sīkāku informāciju sk. šajā atbildē.
Ātra klonēšana ar datu zudumu - JSON.parse/stringify
Ja objektā neizmantojat
Date
, funkcijas,undefined
,Infinity
, RegExps, Maps, Sets, Blobs, FileLists, ImageDatas, retākus masīvus, tipveida masīvus vai citus sarežģītus tipus, ļoti vienkārša viena līnija, lai dziļi klonētu objektu, ir:Klonēšana:
JSON.parse(JSON.stringify(object))
Sk. Corban's atbildi, lai uzzinātu etalonus.
Uzticama klonēšana, izmantojot bibliotēku
Tā kā objektu klonēšana nav triviāla (sarežģīti tipi, apļveida atsauces, funkcijas utt.), lielākā daļa lielāko bibliotēku piedāvā funkciju objektu klonēšanai. Neizgudrojiet velosipēdu no jauna - ja jau izmantojat kādu bibliotēku, pārbaudiet, vai tajā ir objektu klonēšanas funkcija. Piemēram,
cloneDeep
; var importēt atsevišķi, izmantojot moduli lodash.clonedeep, un, iespējams, tā ir labākā izvēle, ja vēl neizmantojat bibliotēku, kas nodrošina dziļas klonēšanas funkciju.angular.copy
jQuery.extend(true, { }, oldObject)
;.clone()
klonē tikai DOM elementus.ES6
Pilnīguma labad jāatzīmē, ka ES6 piedāvā divus seklās kopēšanas mehānismus:
Object.assign()
un spread operators.Ja nav iebūvēta neviena, varat izmēģināt: