2016-10-10 2 views
5

Ich surfe seit einiger Zeit hier herum und habe immer noch keine Antwort gefunden, die für mich funktioniert hat.Wie tief ein benutzerdefiniertes Objekt in JavaScript zu kopieren?

Gibt es eine Möglichkeit, ein nicht einfaches Objekt in JS tief zu kopieren?

Ich habe versucht jQuery.extend(true, {}, this), aber es klonte nur einige davon, der Rest blieb als Referenz auf ein anderes Objekt.

+1

_ „aber nur ein Teil davon kloniert, der Rest blieb als Referenz auf ein anderes Objekt.“ _ Können Sie Objekt in Frage umfassen, stacksnippets erstellen zu demonstrieren? – guest271314

+0

Es gibt immer den 'JSON.parse (JSON.stringify (...))' Hack. –

+1

@AkshatMahajan Wenn es das JSON-Format ist, ist das in Ordnung, OP deutet an, dass es Funktionen hat. – epascarello

Antwort

4

können Sie lodash die cloneDeep Funktion - https://lodash.com/docs/4.16.4#cloneDeep

Beispiel (von docs)

var objects = [{ 'a': 1 }, { 'b': 2 }]; 

var deep = _.cloneDeep(objects); 
console.log(deep[0] === objects[0]); 
// => false 
7

Wenn das Objekt hat keine zirkulären Referenzen oder Funktionen als Werte, können Sie die json stringify Trick :

let myCopy = JSON.parse(JSON.stringify(myObject)); 

Keine Bibliotheken erforderlich und funktioniert sehr gut für die meisten Objekte.

+0

Funktioniert diese Kopie bei 'myObject'? – guest271314

+1

@ guest271314 Nein. Aber warum fügen Sie Funktionen in Datenstrukturen ein? Funktionen müssen wie Routinen an verschiedenen Orten sein. Dies ist nur OOP fehlgeschlagen)) – Deep

+0

@Deep Ein Beispiel für ein Objekt mit Eigenschaften, bei denen Funktionen als Werte festgelegt werden, wäre "Dokument" oder "Fenster" – guest271314

0

Wenn Sie mit einer Klasseninstanz arbeiten, können Sie so etwas verwenden.

Sie müssen die Funktionen nicht kopieren, da sie an den Prototyp delegiert sind.

// myObject constructor 
 
function myObject(foo, bar){ 
 
    this.foo = foo 
 
    this.bar = bar 
 
} 
 
// delegate the functions to a prototype 
 
myObject.prototype.something = function(){ 
 
    console.log('something') 
 
} 
 

 
function instanceCopy(obj) { 
 
    // copy the object by the constructor 
 
    const copy = new obj.constructor() 
 
    const keys = Object.keys(obj) 
 
    keys.forEach(key => { 
 
    copy[key] = obj[key] 
 
    }) 
 
    return copy 
 
} 
 

 
const myObj = new myObject('foo', 'bar') 
 
const copyObj = instanceCopy(myObj) 
 

 
console.log('myObj', myObj) 
 
console.log('copyObj', copyObj) 
 
console.log('same ?', copyObj === myObj) 
 

 
// can we still call the functions 
 
copyObj.something()
<script src="https://codepen.io/synthet1c/pen/WrQapG.js"></script>

Verwandte Themen