2012-04-14 11 views
1

den folgenden JavaScript-Code [jsfiddle]:Kopien von verschachtelten Arrays und Referenzen in Javascript

Array.prototype.remove = function(from, to) { 
    var rest = this.slice((to || from) + 1 || this.length); 
    this.length = from < 0 ? this.length + from : from; 
    return this.push.apply(this, rest); 
}; 

var masterlist = [{ 
    name: "Master1"}, 
{ 
    name: "Master2"}]; 
var parentlist = [{ 
    name: "Parent1"}, 
{ 
    name: "Parent2"}]; 
var childlist = [{ 
    name: "Child1"}, 
{ 
    name: "Child2"}]; 

for (var i = 0; i < masterlist.length; i++) { 
    var master = masterlist[i]; 
    master.parents = parentlist.slice(); 
    for (var j = 0; j < master.parents.length; j++) { 
     var parent = master.parents[j]; 
     parent.children = childlist.slice(); 
    } 
} 

console.log("before removing") 
console.log("master1 parents: " + masterlist[0].parents.length); 
console.log("master2 parents: " + masterlist[1].parents.length); 
console.log("master1 parent 1 childrens: " + masterlist[0].parents[0].children.length); 
console.log("master2 parent 2 childrens: " + masterlist[1].parents[1].children.length); 

masterlist[0].parents.remove(0); 
masterlist[0].parents[0].children.remove(0); 

console.log("after removing") 
console.log("master1 parents: " + masterlist[0].parents.length); 
console.log("master2 parents: " + masterlist[1].parents.length); 
console.log("master1 parent 1 childrens: " + masterlist[0].parents[0].children.length); 
console.log("master2 parent 2 childrens: " + masterlist[1].parents[1].children.length);? 

Ergebnisse in:

vor dem Entfernen
master1 Eltern: 2
master2 Eltern: 2
Master1 Eltern 1 Kinder: 2
Master2 Eltern 2 Kinder: 2
nach dem Entfernen
master1 Eltern: 1
master2 Eltern: 2
master1 Mutter 1 Kinder: 1
master2 Eltern 2 Kinder: 1

Ich würde erwarten (und Notwendigkeit) diese:

vor dem Entfernen
master1 Eltern: 2
master2 Eltern: 2
master1 Mutter 1 Kinder: 2
master2 Elternteil 2 Kinder: 2
nach dem Entfernen
master1 Eltern: 1
master2 Eltern: 2
master1 Mutter 1 Kinder: 1
master2 Eltern 2 Kinder: 2 < - Differenz

Was mache ich falsch ? Es sieht so aus, als ob die Childs auf das gleiche Array verweisen, auch habe ich das anfängliche Children-Array geschnitten (was mit dem Eltern-Array wie erwartet funktioniert hat).

+1

Warum verwenden Sie '.splice()' nicht, um Elemente aus einem vorhandenen Array zu entfernen? – jfriend00

+0

Das würde das ursprüngliche Problem nicht beheben. Betrachte Masterlist [0] .parents [0] .children.push ({name: "child3"}); Beide sind wieder aktualisiert. –

+0

Es wäre gut zu wissen, was Sie insgesamt mit diesem Skript zu tun versuchen. Das Einfügen des Codes und der erwarteten Ausgabe kann uns beim Lesen des Codes – Tamil

Antwort

3

ein Blick auf http://de.selfhtml.org/javascript/objekte/array.htm#slice Having (von mir getan Übersetzung), um eine mögliche Antwort liefern könnte:

„Bitte beachten Sie: Wenn sich ein Objekt innerhalb des Arrays, das neu erstellte Array enthalten ist enthält einen Verweis auf das Objekt. Das bedeutet: Wenn das Objekt geändert wird, ändert sich auch das Array, das mit slice() erstellt wurde. Wenn Zahlen und Strings enthalten sind, werden sie kopiert. "

Sollte erklären, warum beide ändern, sollte es nicht?

+0

Danke, Genehmigung Ihrer Annahme: http://jsfiddle.net/AlexZeitler/U4cpa/5/ –

Verwandte Themen