将对象推入数组时会出现问题

vik*_*ute 1 javascript

这是代码

var arr = [1,2,3];
var entry = {};
var test = [];
for(var i=0;i<arr.length;i++){
   entry.id = arr[i];
   test.push(entry);
}

console.log(test);
Run Code Online (Sandbox Code Playgroud)

我想输出一个有三个不同对象的数组.但现在我的对象都是一样的,为什么?

[Object {id = 3},Object {id = 3},Object {id = 3}]

T.J*_*der 11

问题是您在所有循环迭代中重用相同的对象.在循环中创建一个 entry对象:

var arr = [1,2,3];
var entry;                      // (modified, don't create here)
var test = [];
for(var i=0;i<arr.length;i++){
   entry = {id: arr[i]};        // (modified, create new one here, with `id` prop)
   test.push(entry);
}

console.log(test);
Run Code Online (Sandbox Code Playgroud)

否则,如果您只是entry.id在每个循环上分配,则只需更改id同一对象上的属性.将对象引用推送到数组时,您只需按下引用,而不是复制对象.

当然,entry如果你愿意,你可以完全取消变量,但你可能想要保持它的清晰度等等.这里没有:

var arr = [1,2,3];
var test = [];
for(var i=0;i<arr.length;i++){
   test.push({id: arr[i]});
}

console.log(test);
Run Code Online (Sandbox Code Playgroud)

有些偏离主题:

创建对象并同时为其分配属性的结构称为对象文字.如果您有多个属性,则可以使用逗号分隔初始值设定项.例如:

var obj = {a: 1, b: 2, c: 3};
Run Code Online (Sandbox Code Playgroud)

是相同的

var obj = {};
obj.a = 1;
obj.b = 2;
obj.c = 3;
Run Code Online (Sandbox Code Playgroud)

值(表达的右侧:)可以是赋值语句中的表达式.名称(左侧:)是文字,如上所述,或字符串:

var obj = {"a": 1, 'b': 2, c: 3};
//         ^^^     ^^^     ^---- literal is fine
//          |       +----------- string (with single quotes) also fine
//          +------------------- string (with double quotes) also fine
Run Code Online (Sandbox Code Playgroud)

偏离主题的注意事项:如果在某些时候您发现自己使用JSON进行数据交换,则规则类似但限制性稍强(JSON是对象文字表示法的子集).具体来说,属性名称必须引号,并且所有字符串值(即使在右侧)也必须使用双引号.