【问题标题】:Pushing objects to an array, then modifying them, makes all object properties the same [duplicate]将对象推送到数组,然后修改它们,使所有对象属性相同[重复]
【发布时间】:2015-07-01 15:06:51
【问题描述】:

当我运行这段代码时:

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

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

console.log(data);

我希望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'
  }
]

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

【问题讨论】:

  • JavaScript 从不复制复合数据结构的赋值。您正在将对该对象的引用推送到数组中。
  • 我知道。如何解决?

标签: javascript javascript-objects


【解决方案1】:

问题是您多次推送同一个对象并对其进行编辑。

尝试在循环中定义 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;
}

【讨论】:

  • 我不能。我应该使用外部变量“e”。
  • 此外:将“e”分配给任何本地变量都会产生相同的结果
  • jQuery?为什么选择 jQuery? var e_copy = {}; for (var p in e) e_copy[p] = e[p];
  • 克隆!这对我来说已经足够了。谢谢!
  • @squint jquery 有一个有用的克隆 fn。您可以使用下划线或自己滚动。我只是更熟悉那个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多