我正在尝试从添加了一些对象的列表中返回一些值。在循环内部,我得到了正确的输出,但是在循环外部,它没有按预期运行。我可能没有通过一些基本的操作,但是我真的找不到发生了什么。这是我所拥有的:
var register = { name: "", number: "" };
var listName = new Array();
var listNumber = new Array();
var listObject = new Array();
listName.push("A");
listName.push("B");
listName.push("C");
listNumber.push(1);
listNumber.push(2);
listNumber.push(3);
for(var i = 0; i < listName.length; i++)
{
register.name = listName[i];
register.number = listNumber[i];
listObject.push(register);
console.log(listObject[i].name) //"A" then "B" then "C"
console.log(listObject[i].number) //"1" then "2" then "3"
}
console.log(listObject[0].name); //"C"
console.log(listObject[1].name); //"C"
console.log(listObject[2].name); //"C"
console.log(listObject[0].number); //"3"
console.log(listObject[1].number); //"3"
console.log(listObject[2].number); //"3"
在此先感谢您提供进一步的帮助!
答案 0 :(得分:1)
@CertainPerformance是正确的。您对JavaScript中的对象引用缺乏理解导致了此错误。
register
在循环外被声明为变量,因此其作用域在循环外。这意味着每次循环代码运行时,都要重置寄存器对象的属性,然后将同一对象推入数组。因此,在您的示例中,listObject
数组由对register
对象的3个相同的引用组成。
将循环更改为:
for(let i = 0; i < listName.length; i++) {
let register = {name: listName[i], number: listNumber[i]};
listObject.push(register);
}
答案 1 :(得分:1)
如前所述,您只有一个register
变量,它在每次迭代时都会被覆盖。
您可以直接将对象推入listObject,而无需声明外部作用域变量。
var listName = new Array();
var listNumber = new Array();
var listObject = new Array();
listName.push("A");
listName.push("B");
listName.push("C");
listNumber.push(1);
listNumber.push(2);
listNumber.push(3);
for(var i = 0; i < listName.length; i++)
{
listObject.push({ name: listName[i], number: listNumber[i] });
console.log(listObject[i].name) //"A" then "B" then "C"
console.log(listObject[i].number) //"1" then "2" then "3"
}
console.log(listObject[0].name); //"now A"
console.log(listObject[1].name); //"now B"
console.log(listObject[2].name); //"now C"
console.log(listObject[0].number); //"now 1"
console.log(listObject[1].number); //"now 2"
console.log(listObject[2].number); //"now 3"
答案 2 :(得分:1)
函数迭代时会添加一个新的寄存器对象。每次迭代,寄存器对象的键和值都会更新。
相反,每次迭代都创建一个寄存器对象并将其推送。
像这样:
for(var i = 0; i < listName.length; i++)
{
let registerObject = {name: listName[i], number: listNumber[i]};
listObject.push(registerObject);
console.log(listObject[i].name) //"A" then "B" then "C"
console.log(listObject[i].number) //"1" then "2" then "3"
}