Javascript-从列表返回值

时间:2018-08-23 01:34:48

标签: javascript arrays object

我正在尝试从添加了一些对象的列表中返回一些值。在循环内部,我得到了正确的输出,但是在循环外部,它没有按预期运行。我可能没有通过一些基本的操作,但是我真的找不到发生了什么。这是我所拥有的:

  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"

在此先感谢您提供进一步的帮助!

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"
  }