2016-10-24 7 views
0

私は、コードを次ています以前の参照を使用してアレイプッシュはまだですか?

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

私はループ内var student = {};入れているが、どういうわけか、生徒たちは、このように、それは同じ参照を参照してはなりません、そのすべての内容について、同じオブジェクトを印刷します。

これはなぜ起こるのでしょうか?

+0

注;'割り当てはすぐに '学生=クラスによって無効になる[i]の.student;'割り当て。これら二つの行の結果が単一の代入文を実行するのと同じ場合 'var student = classes [i] .student; ' –

答えて

2

student = {}をループの内側に置き、次にその直後の行にstudent = classes[i].studentを上書きします。

意図が何であれclasses[i].studentのコピーは、あなたがObject.assign() methodを使用できるようにするためにある場合:

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

文脈で:

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); 
} 

Object.assign()は深いコピーをしないことに注意してください - 配列構造がclassesであることを示していないため、重要かどうかはわかりません。

明示的なforループの代わりに.map() methodを使用します。あなたの `VARの学生= {}

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

実際には、生徒オブジェクトを最初のレベルにしたいと思います。私がこのコード 'student:classes [i] .student'を使うと、それはネストされたオブジェクトになります。 – Rendy

+0

私は 'student = classes [i] .studentを使うと、代わりに別のオブジェクトを参照すべきですか? – Rendy

+0

'classes [i] .student'オブジェクトのコピーを作るコードで私の答えを更新しました。元の 'student = classes [i] .student'に関しては、' students'変数が 'classes [i] .student'が参照するのと同じオブジェクトを参照するように割り当てます。 – nnnnnn

関連する問題