我在for循环中遇到了问题
var a={ name:""};
var nameList=['jack','luck'];
var data=[];
for(var i=0;i<nameList.length;i++){
a.name=nameList[i];
data.push(a);
}
console.log(data) //output [Object { name="luck"}, Object { name="luck"}]
我想要的数据是[Object {name =“jack”},Object {name =“luck”}]。
当我在循环中将代码更改为data.push({name:nameList[i]})
和data[i] = {name:nameList[i]}
时,它们都会返回我期望的正确值。
谁能告诉我那里有什么不同?
答案 0 :(得分:4)
您只有一个对象,并且您反复更改其名称,并将对它的引用推送到数组上。这就是变量在JavaScript中的工作方式;复制是通过值完成的,保存对象的变量的值是对象的引用。
每次迭代都需要创建一个新对象。
for(var i=0;i<nameList.length;i++){
a = { name: nameList[i] }
data.push(a);
}
答案 1 :(得分:4)
您将同一个对象一遍又一遍地推入到数组中,每次更改name
属性时,您每次都只是在同一个对象上进行更改。您需要每次创建对象的新副本,以便每个副本都不同。你甚至不用像这样的中间变量就可以做到这一点:
var nameList = ['jack','luck'];
var data = [];
for(var i = 0; i < nameList.length; i++){
data.push({name: nameList[i]}); // creates a new object each time thru the loop
}
或者,如果您想要中间对象(出于其他原因 - 对于您已经显示的代码不是必需的),它将如下工作:
var nameList = ['jack','luck'];
var data = [], a;
for(var i = 0; i < nameList.length; i++){
a = {};
a.name = nameList[i];
data.push(a);
}
注意,每次通过循环时如何为a
分配一个新对象,以便每次都创建一个新对象并将其推入数组。
答案 2 :(得分:0)
您在两个数组元素中都使用a
。这是同一个对象。第二次更改名称时,您将更改它们。