javascript对象被覆盖

时间:2019-05-15 12:09:27

标签: javascript arrays object

我正在尝试获取用户输入并将值推入数组。但是数组只是将最后输入的值复制到所有先前的值。不知道我要去哪里错了。

    var arrTest = [];
    var objTest = {};
    var inputName = prompt("Enter name");
    var inputValue = prompt("Enter value");

while (inputName.length > 0 && inputValue > 0) { 
    objTest.name = inputName;
    objTest.value = inputValue;
    arrTest.push(objTest);
    inputName = prompt("Enter name");
    inputValue = prompt("Enter value");
}

printDetails(arrTest);
}

function printDetails(arrN){
    var vOutput = ""
    for(var vIndex = 0; vIndex < arrN.length ; vIndex++){
    vOutput = vOutput +" Name: " + arrN[vIndex].name+ " Value :" + dogN[vIndex].value+ ";
    }
document.getElementById("output").innerHTML=vOutput;
}

如果仅输入1个值测试1,则输出为

  

名称:测试值:1

如果仅输入2个值,则测试1,最好的2个输出为

  

名称:最佳价值:2   名称:最佳价值:2

我的期望值应该是:

  

名称:测试值:1   名称:最佳价值:2

我在做什么错了?

3 个答案:

答案 0 :(得分:1)

您应该改用arrTest.push(objTest)。

此外,在while循环中声明objTest。

代码将为

var arrTest = [];
var inputName, inputValue;

for (let i=0; i<3; i++) { 

// Here should be the declaration
    var objTest = {};

// User input
    inputName = prompt("Enter name");
    inputValue = prompt("Enter value");

    objTest.name = inputName;
    objTest.value = inputValue;
    arrTest.push(objTest);
}

printDetails(arrTest);

function printDetails(arrN){
    let vOutput = "";
    for(let vIndex = 0; vIndex < arrN.length ; vIndex++){
        vOutput = vOutput +" Name: " + arrN[vIndex].name+ " Value :" + arrN[vIndex].value+ "\n";
    }
    console.log(vOutput);
}

答案 1 :(得分:1)

观察到这种行为的原因是,当您调用arrTest.push(objTest)时,实际上是在向数组添加对象的引用,而不是对象本身。然后,当您更改对象并再次将其推入时,您将向该对象添加另一个引用,该引用仅包含更新后的值。

您可以通过完全不使用变量来解决此问题:

while (inputName.length > 0 && inputValue > 0) {
    arrTest.push({ name: inputName, value: inputValue });
    inputName = prompt("Enter name");
    inputValue = prompt("Enter value");
}

您可以在循环内定义对象,这样您就不会在引用的对象上工作:

while (inputName.length > 0 && inputValue > 0) {
    const objTest = {}
    objTest.name = inputName;
    objTest.value = inputValue;
    arrTest.push(objTest);
    inputName = prompt("Enter name");
    inputValue = prompt("Enter value");
}

使用新的传播语法,您甚至可以实现类似的操作,在其中您可以使用变量,在循环之外定义它,但仍然不使用像这样的引用:

while (inputName.length > 0 && inputValue > 0) {
    objTest.name = inputName;
    objTest.value = inputValue;
    arrTest.push({ ...objTest });
    inputName = prompt("Enter name");
    inputValue = prompt("Enter value");
}

答案 2 :(得分:0)

我已经重写了一些代码。试试这个。

var arrTest = [];
var objTest = {};
var inputName = prompt("Enter name");
var inputValue = prompt("Enter value");

while (inputName.length > 0 && inputValue.length > 0) { 
    var objTest = {};
    objTest.name = inputName;
    objTest.value = inputValue;
    arrTest.push(objTest);
    inputName = prompt("Enter name");
    inputValue = prompt("Enter value");
}

printDetails(arrTest);

function printDetails(arrN){
  console.log(arrN)
  /* do for loop */
}