数组推送仍然使用以前的参考?

时间:2016-10-24 02:44:23

标签: javascript

我有以下代码:

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 = {};放在循环中,因此它不能引用相同的参考。

任何人都知道为什么会这样?

1 个答案:

答案 0 :(得分: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数组结构是什么。)

您还可以使用.map() method代替明确的for循环:

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