这是代码
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}]
答案 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);
试试。