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

时间:2011-07-01 10:28:03

标签: 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);

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

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

2 个答案:

答案 0 :(得分:9)

问题是你在所有循环迭代中重用相同的对象。在循环中创建 new 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);

否则,如果您只是在每个循环上分配给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);

偏离主题

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

var obj = {a: 1, b: 2, c: 3};

相同
var obj = {};
obj.a = 1;
obj.b = 2;
obj.c = 3;

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

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

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

答案 1 :(得分:1)

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

console.log(test);

试试。