2017-10-10 2 views
1

Ist es möglich, mit ES5 JavaScript tief zu kopieren?Ist es möglich, mit ES5 JavaScript tief zu kopieren?

Das Problem, das ich derzeit habe, ist Eigenschaften verschachtelten mehr als 2 Ebenen tief scheinen, durch Referenz anstelle von Wert zu kopieren.

Hier ist, was ich zur Zeit kopieren implementiert haben ...

// Clone an object and return the clone 
function clone (obj) { 
    var newObj = (obj instanceof Array) ? [] : {}; 
    for (var prop in obj) { 
     if(typeof obj[prop] === 'object') { 
      newObj[prop] = clone(obj[prop]); 
     } 
     newObj[prop] = obj[prop] 
    } 
    return newObj; 
}; 

Und hier ist der Code zum Test verwendet:

const a = { a: 1, b: { c: 2 }}; 
const b = clone(a); 

a.a = 10; 
b.a == a.a; // false 

a.b = 10; 
b.b == 10; // false 

a.b.c = 10; 
a.b.c == b.b.c; // true 

Der letzte, den Wert c sowohl a geändert und b Objekte. Die c-Eigenschaft scheint ein Referenztyp zu sein.

Wie kann ich sicherstellen, dass alle Werte nach Wert kopiert werden und keine Referenzen sind?

Antwort

1

Sie sind Klonen Objekte verschachtelt, aber sie dann wieder mit dem ursprünglichen Objekt überschreiben:

if(typeof obj[prop] === 'object') { 
    newObj[prop] = clone(obj[prop]); 
} 
newObj[prop] = obj[prop] 

dies stattdessen versuchen:

if(typeof obj[prop] === 'object') { 
    newObj[prop] = clone(obj[prop]); 
} else { 
    newObj[prop] = obj[prop] 
} 
+1

Hl Christus. Es war ein langer Tag! Aber danke, dass du das gesehen hast. Funktioniert. – BugHunterUK

3

Sie können jederzeit die der arme Mann verwenden Tiefklon durch Streichen und dann Parsen:

function clone (obj) { 
 
    return JSON.parse(JSON.stringify(obj)); 
 
}; 
 

 
const a = { a: 1, b: { c: 2 }}; 
 
const b = clone(a); 
 

 
a.a = 10; 
 
console.log(b.a == a.a); // false 
 

 
console.log(a.b = 10); 
 
console.log(b.b == 10); // false 
 

 
console.log(a.b.c = 10); 
 
console.log(a.b.c == b.b.c); // true

Mit stringify/Parse hat Funktionen und regexps nicht kopieren, damit die "armen Mann". Eine bessere Option ist die Verwendung eines Moduls wie , das alles klonen kann.

+1

Hinweis: Vergessen Sie nicht, dass dies 'Funktionen' oder' RegExp' nicht kopiert – nadavvadan

+0

Auch das ist sehr langsam. – BugHunterUK

+0

Beachten Sie, dass _very slow_ immer relativ ist. – Timo

0

ES5 Verwendung

var a = JSON.parse (JSON.stringify (b))

ES6 Verwendung

var a = Object.assign (b)

Verwenden von Underscore/Lodash

var a = _.map (b, _.clone)

Verwandte Themen