2016-10-24 11 views
0

ich folgenden Code haben:Array-Push immer noch mit der vorherigen Referenz?

var students = []; 
for(var i = 0; i < classes.length; i++) { 
    var student = {}; 
    student = classes[i].student; 
    student.teacher = classes[i].teacher; 
    students.push(student); 
} 

Irgendwie werden die Studenten gleiche Objekt für alle Inhalte drucken, obwohl ich var student = {}; innerhalb der Schleife gesetzt haben, so darf es nicht zu gleichen Bezugs beziehen.

Hat jemand eine Idee, warum das passiert?

+0

Beachten Sie, dass 'var Student = {};' Zuordnung sofort von den 'Student = Klassen für ungültig erklärt wird [i] .student;' Zuordnung. Das Ergebnis dieser beiden Zeilen ist identisch mit dem Ausführen der einzelnen Zuweisung 'var student = classes [i] .student;' –

Antwort

2

Sie setzen student = {} innerhalb der Schleife, dann auf der Zeile unmittelbar nach der, die Sie überschreiben, indem Sie student = classes[i].student zuweisen.

Wenn die Absicht ist, eine Kopie zu machen, was auch immer von classes[i].student sind Sie die Object.assign() method verwenden:

var student = Object.assign({}, classes[i].student); 

Im Kontext:

var students = []; 
for(var i = 0; i < classes.length; i++) { 
    var student = Object.assign({}, classes[i].student); 
    student.teacher = classes[i].teacher; 
    students.push(student); 
} 

(Beachten Sie, dass Object.assign() nicht eine tiefe Kopie macht - Ich bin nicht sicher, ob das wichtig ist, weil Sie nicht gezeigt haben, was die classes Array-Struktur ist.)

Sie könnten auch Verwenden Sie die .map() method anstelle eines expliziten for Schleife:

var students = classes.map(function(c) { 
    var student = Object.assign({}, c.student); 
    student.teacher = c.teacher; 
    return student; 
}); 
+0

Eigentlich möchte ich ein student-Objekt als erste Ebene festlegen. Wenn ich diesen Code 'student: classes [i] .student' verwende, wird es ein verschachteltes Objekt sein. – Rendy

+0

Ich dachte, wenn ich 'student = classes [i] .student verwende, sollte es sich stattdessen auf anderes Objekt beziehen? – Rendy

+0

Ich habe meine Antwort mit Code aktualisiert, der eine Kopie des Objekts "classes [i] .student" erstellt. In Bezug auf Ihr ursprüngliches 'student = classes [i] .student', das die' student'-Variable zuweist, um sich auf dasselbe Objekt zu beziehen, auf das sich 'classes [i] .student' bezieht. – nnnnnn

Verwandte Themen