Javascript 如何更新循环中的对象属性?

Javascript 如何更新循环中的对象属性?,javascript,object,Javascript,Object,在尝试使用循环来更改对象中某个属性的值集时,我发现了一种意想不到的行为 基本上,我在循环之外声明我的对象。 然后我循环一个数值数组,这些数值用于更新对象属性。 在循环中,我将当前对象状态存储在外部数组中 结果是,我没有使用包含一系列具有不同数值的对象的数组,而是在每个存储的对象中使用相同的数值 这是小提琴 jQuery(function(){ var object_container = []; var numeric_values = [1, 2 , 3, 4];

在尝试使用循环来更改对象中某个属性的值集时,我发现了一种意想不到的行为

基本上,我在循环之外声明我的对象。 然后我循环一个数值数组,这些数值用于更新对象属性。 在循环中,我将当前对象状态存储在外部数组中

结果是,我没有使用包含一系列具有不同数值的对象的数组,而是在每个存储的对象中使用相同的数值

这是小提琴

jQuery(function(){

    var object_container = [];

    var numeric_values = [1, 2 , 3, 4];

    var my_object = {};


    jQuery.each(numeric_values, function(index, value){
        my_object['value'] = value;
        object_container.push(my_object);
    });

    jQuery.each(object_container, function(index, value){
        jQuery('#content').prepend(value['value']);
    });

});
我希望得到1234作为存储在每个对象中的值,然而,我得到的是444,这对我来说没有意义


关于此行为的任何提示都是非常受欢迎的,谢谢

当您的代码调用
.push()
并传递
my_对象时,传递的是对该对象的引用。没有复制

因此,您已将对完全相同对象的四个引用推送到数组中

JavaScript对象总是以引用的形式参与表达式。没有其他方法来处理对象。因此,当您创建一个变量并将其值设置为对象时,实际上是将其值设置为对象的引用。与参数传递相同,对象可以出现在表达式中的任何其他位置

在这种情况下,您可以非常轻松地创建新对象;只需省去
my_object
,并在每次迭代中推送一个新对象:

    object_container.push( { value: value } );

您并不是每次在循环中都创建一个新对象——您只是更新同一个现有对象并将其引用推送到对象数组。要创建新对象,请执行以下操作:

my_object = { 'value': value };
object_container.push(my_object);
在这种情况下,您现在将得到更像您所寻找的东西。请参见此处更新的小提琴:

祝你好运


还有一个想法(克隆!)-如果每次都要使用同一个对象,只需在添加到阵列之前克隆该对象即可。有一个很好的解决方案。

您正在使用jQuery,因此如果您希望合并而不影响原始外观,请查看:

var both_obj = $.extend( {}, default_obj , adding_obj );
这将使您的原始对象保持更改,也可用于
复制


另一种版本是使用具有构造函数的对象和
new
关键字:

var object_container = [];  
var numeric_values = [1, 2 , 3, 4]; 

function MyObject(value)
{
    this.value = value;
}


jQuery.each(numeric_values, function(index, value){     
    object_container.push(new MyObject(value));
});

jQuery.each(object_container, function(index, value){
    jQuery('#content').prepend(value['value']);
});

更正,若要修复,请在推送之前的每次迭代中创建一个新的
my_对象