Daugiau
Koks yra veiksmingiausias būdas "JavaScript" giliai klonuoti objektą?
Koks veiksmingiausias būdas klonuoti "JavaScript" objektą? Esu matęs, kad naudojamas obj = eval(uneval(o));
, bet tai nestandartinis variantas, kurį palaiko tik "Firefox".
Esu daręs tokius dalykus kaip obj = JSON.parse(JSON.stringify(o));
, bet abejoju dėl efektyvumo.
Taip pat esu matęs rekursinio kopijavimo funkcijų su įvairiais trūkumais.
Aš'stebiuosi, kad nėra kanoninio sprendimo.
5181
3
Gimtasis gilusis klonavimas
Tai vadinama "struktūrizuotu klonavimu", eksperimentiniu būdu veikia "Node 11" ir vėlesnėse versijose ir, tikiuosi, bus įdiegta naršyklėse. Daugiau informacijos žr. šis atsakymas.
Greitas klonavimas prarandant duomenis - JSON.parse/stringify
Jei objekte nenaudojate
Date
, funkcijų,undefined
,Infinity
, RegExps, Maps, Sets, Blobs, FileLists, ImageData, retų masyvų, tipinių masyvų ar kitų sudėtingų tipų, labai paprasta viena eilutė giliam objekto klonavimui yra:JSON.parse(JSON.stringify(object))
Žr. Corban's answer, kur pateikiami lyginamieji pavyzdžiai.
Patikimas klonavimas naudojant biblioteką
Kadangi objektų klonavimas nėra trivialus (sudėtingi tipai, žiedinės nuorodos, funkcijos ir t. t.), dauguma pagrindinių bibliotekų pateikia objektų klonavimo funkciją. Neišradinėkite dviračio - jei jau naudojate biblioteką, patikrinkite, ar ji turi objektų klonavimo funkciją. Pvz,
cloneDeep
; galima importuoti atskirai per modulį lodash.clonedeep ir tai tikriausiai geriausias pasirinkimas, jei dar nenaudojate bibliotekos, kuri turi gilaus klonavimo funkcijąangular.copy
jQuery.extend(true, { }, oldObject)
;.clone()
klonuoja tik DOM elementusES6
Išsamumo dėlei atkreipkite dėmesį, kad ES6 siūlo du negilaus kopijavimo mechanizmus:
Object.assign()
ir spread operator.Jei nėra jokio integruoto, galite pabandyti: