将对象推送到数组,然后修改它们,使所有对象属性都相同

时间:2015-07-01 15:06:52

标签: javascript javascript-objects

当我运行此代码时:



var e = {
  'id': 0,
  'name': 'n'
};
var data = [];

for (var i = 0; i < 3; i++) {
  e.id = i;
  data.push(e);
}

console.log(data);
&#13;
&#13;
&#13;

我希望data看起来像这样:

[
  {
    'id': 0,
    'name': 'n'
  },
  {
    'id': 1,
    'name': 'n'
  },
  {
    'id': 2,
    'name': 'n'
  }
]

但实际结果是:

[
  {
    'id': 2,
    'name': 'n'
  },
  {
    'id': 2,
    'name': 'n'
  },
  {
    'id': 2,
    'name': 'n'
  }
]

为什么会发生这种情况以及如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

问题在于您多次推动同一个对象并进行编辑。

尝试在循环中定义e:

var data=[];
for(var i=0;i<10;i++)
{
    var e={'id':i,'name':'n'};
    data.push(e);
}

或者使用克隆(使用jquery):

var data=[];
var e={'id':0,'name':'n'};
for(var i=0; i<10; i++)
{
    var e_copy = jQuery.extend({}, e); // or clone(e)
    e_copy.id=i;
    data.push(e);
}

滚动你自己的克隆fn:

function clone(o){
    var o_copy = {}; 
    for (var p in o) {
        if (o.hasOwnProperty(p)){
            o_copy[p] = o[p]
        }
    }
    return o_copy;
}