2016-06-20 3 views
2

Ich versuche, ein Array von Objekten einem anderen Array zuzuordnen, aber wenn ich das neue Array erstellt habe und in anderen Funktionen den Wert ändere, ändert sich auch das ursprüngliche Array (was nicht ok). Könnte ich einen anderen Weg benutzen? Dies ist ein Beispiel: http: //codepen.io/Xiwi/pen/rLMbYpArray eines Objekt-Inhalts einem neuen Array zuweisen

Antwort

3

Sieht so aus, als müssten Sie das Array kopieren/klonen, damit es nicht durch Referenz geändert wird.

Wenn Sie nur Primitive Types im Array Sie so tun können:

var test3 = JSON.parse(JSON.stringify(test2)); 

sonst benötigen Sie eine rekursive Lösung und spezifischere in Ihrer Frage zu sein.

Beispiel:

var test1 = [{name: 'test1'}]; 
 
var test2 = [{name: 'test2'}]; 
 
var test3 = JSON.parse(JSON.stringify(test2)); 
 

 
test3[0].name = 'test3'; 
 

 
// Open console 
 
console.log('Test2: ',test2[0]); // Object {name: "test2"} 
 
console.log('Test3: ',test3[0]); // Object {name: "test3"}

+0

Sie müssen nicht serialisiert werden, glaube ich '[] .splice (0,0, arr);' eine Kopie von Primitiven – kirinthos

+0

leider 'do [] .concat (arr)' – kirinthos

+0

@kirinthos Nein. So haben Sie das gleiche Problem. Überprüfen Sie hier: https://jsfiddle.net/jbL0vm9m/ – Sergio

0

Objekte sind im wesentlichen Referenzen. Sie müssen ein neues Objekt erstellen und die Werte eines anderen Objekts zuweisen:

var test3 = [ Object.assign({}, test2[0]) ]; 
0

Verwenden Sie einfache .map ein Array von Objekten in einen anderen zu kopieren.

var test1 = [{name: 'test1'}]; 
var test2 = [{name: 'test2'}]; 
//var test3 = test2.slice(0); //doesn't work. objects are still references 
var test3 = test2.map(function(obj){ 
    //return obj; //doesn't work. objects are still references 
    var o={}; //create brand new object 
    for(var prop in obj) 
    o[prop]=obj[prop];//assign properties 
    return o;//works 
}); 

test3[0].name = 'test3'; 

// Open console 
console.log('Test2: ',test2[0]); 
console.log('Test3: ',test3[0]);