Javascript 尝试在数组中循环,并添加额外的键值对,结果只有最后一个值

Javascript 尝试在数组中循环,并添加额外的键值对,结果只有最后一个值,javascript,arrays,Javascript,Arrays,我试图从循环使用的现有数组中创建一个新的对象数组,但最终只得到最后一个值。我知道为什么会这样,只是不知道该采取什么方法来获得预期的结果 var existingThing = ["one","two","three"]; var thingtoAdd = {}; var newthing = []; for (var i = 0; i < existingThing.length; i++) { thingtoAdd.key = existingThing[i];

我试图从循环使用的现有数组中创建一个新的对象数组,但最终只得到最后一个值。我知道为什么会这样,只是不知道该采取什么方法来获得预期的结果

var existingThing = ["one","two","three"];

var thingtoAdd = {};

var newthing = [];

for (var i = 0; i < existingThing.length; i++) {

    thingtoAdd.key = existingThing[i];
    thingtoAdd.value = existingThing[i];
    thingtoAdd.selected = "true";
    newthing.push(thingtoAdd);
}

console.log(JSON.stringify(newthing));
var existingThing=[“一”、“二”、“三”];
var newthing=[];
for(var i=0;i
var existingThing=[“一”、“二”、“三”];
var newthing=[];
for(var i=0;i
按下按钮后清空要添加对象的内容

for (var i = 0; i < existingThing.length; i++) {

    thingtoAdd.key = existingThing[i];
    thingtoAdd.value = existingThing[i];
    thingtoAdd.selected = "true";
    newthing.push(thingtoAdd);
    thingToAdd = {};
}
for(var i=0;i
按下按钮后清空要添加对象的内容

for (var i = 0; i < existingThing.length; i++) {

    thingtoAdd.key = existingThing[i];
    thingtoAdd.value = existingThing[i];
    thingtoAdd.selected = "true";
    newthing.push(thingtoAdd);
    thingToAdd = {};
}
for(var i=0;i
将代码更改为:

var existingThing = ["one","two","three"];

var newthing = [];

for (var i = 0; i < existingThing.length; i++) {

    var thingtoAdd = {};

    thingtoAdd.key = existingThing[i];
    thingtoAdd.value = existingThing[i];
    thingtoAdd.selected = "true";
    newthing.push(thingtoAdd);
}

console.log(JSON.stringify(newthing));
var existingThing=[“一”、“二”、“三”];
var newthing=[];
for(var i=0;i
您正在不断重写相同的对象thingtoAdd,因为它存在于外部循环范围中。当您将其移动到循环的内部块时,您将在每次迭代中添加一个具有所需值的新对象。

将代码更改为:

var existingThing = ["one","two","three"];

var newthing = [];

for (var i = 0; i < existingThing.length; i++) {

    var thingtoAdd = {};

    thingtoAdd.key = existingThing[i];
    thingtoAdd.value = existingThing[i];
    thingtoAdd.selected = "true";
    newthing.push(thingtoAdd);
}

console.log(JSON.stringify(newthing));
var existingThing=[“一”、“二”、“三”];
var newthing=[];
for(var i=0;i

您正在不断重写相同的对象thingtoAdd,因为它存在于外部循环范围中。当您将其移动到循环的内部块时,您将在每次迭代中添加一个具有所需值的新对象。

每次按thing将对象添加到数组
newthing
,您只会按该对象的引用“thingtoAdd”,因此,当您在
for
循环的第二次或第三次迭代中更新对象时,您正在更新对象本身,因此包含对象引用的数组也会每次更新,因此该数组将有两个具有相同值或对象上次更新值的“thingtoAdd”对象

所以清空对象意味着每次都要创建一个对象实例。在
for
循环中放置一个调试器,并检查“newthing”数组,您可以找到答案

var obj = { val: 5 }
function increment(obj) {
    obj.val++
}
increment(obj)
当您调用上述函数
obj
值时,它将每次递增,但

function increment(val) {
   val++
}
val = 5
increment(val)
alert(val)

在上述情况下,
val
将是相同的。区别在于,在第一个示例中,
obj
没有更改,但它引用的数据被修改,而在第二个示例中,变量
val
被更改。

每次您将对象添加到数组
newthing
,您只推该对象的引用,“thingtoAdd”,因此当您在
for
循环的第二次或第三次迭代中更新对象时,您正在更新对象本身,因此包含对象引用的数组也会每次更新,因此数组将有两个具有相同值或对象上次更新值的“thingtoAdd”对象

因此清空对象意味着您每次都在创建对象的实例。在
for
循环中放置一个调试器,并检查“newthing”数组,您可以找到答案

var obj = { val: 5 }
function increment(obj) {
    obj.val++
}
increment(obj)
当您调用上述函数
obj
值时,它将每次递增,但

function increment(val) {
   val++
}
val = 5
increment(val)
alert(val)

在上述情况下,
val
将是相同的。区别在于,在第一个示例中,
obj
没有更改,而是它引用的数据被修改,而在第二个示例中,变量
val
被更改。

thingtoAdd
在循环外声明。您需要将
var thingtoAdd={};
在forloop中。
thingtoAdd
是同一个对象,三次?为什么你要用字符串值来表示似乎是布尔值的东西?@torazaburo虽然我完全同意你的评论,但OP要求帮助解释为什么“newthing”最终得到了“three”的三个副本“,而不是批评代码样式/正确的数据类型用法。”-)@AndrewSteitz SO充满了针对外围问题的评论。如果OP不在乎,他可以忽略它们。
thingtoAdd
在循环之外声明。您需要将
var thingtoAdd={}在forloop中。
thingtoAdd
是同一个对象,三次?为什么要使用字符串值来表示似乎是布尔值的东西?@torazaburo虽然我完全同意你的评论,但OP要求帮助解释为什么“newthing”最终会有三个“three”副本,而不是对代码样式/正确的数据类型用法的批评@AndrewSteitz SO充满了针对外围问题的评论。如果OP不在乎,他可以忽略它们。一个解释,因为这不是一个完整的答案:这是有效的,因为在原始代码中,您是一个