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

时间:2014-07-15 19:42:00

标签: javascript object

我发现了一个在尝试使用循环时没想到的行为,以便更改对象中属性的值集。

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

结果是,不是让一个数组包含一系列具有不同数值的对象,我最终在每个存储的对象中都有相同的数值。

这是小提琴 http://jsfiddle.net/fAypL/1/

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']);
    });

});

我希望得到1 2 3 4作为存储在每个对象中的值,但是,我得到的是4 4 4 4,这对我来说没有意义。

非常欢迎任何有关此行为的提示,谢谢

4 个答案:

答案 0 :(得分:5)

当您的代码调用.push()并传递my_object时,传递的内容是对象的引用。没有副本。

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

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

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

    object_container.push( { value: value } );

答案 1 :(得分:2)

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

my_object = { 'value': value };
object_container.push(my_object);

在这种情况下,您现在将获得更像您所寻找的东西。请在此处查看更新的小提琴:http://jsfiddle.net/fAypL/2/

祝你好运!

还有一个想法(克隆!) - 如果你真的想要每次使用同一个对象,只需在添加到数组之前克隆对象。 that here有一个很好的解决方案。

答案 2 :(得分:0)

你正在使用jQuery,所以如果你想要的是合并而不影响原始的外观:

var both_obj = $.extend( {}, default_obj , adding_obj );

这会使您的原始对象发生变化,也可以用于copy

jquery docs - extend()

答案 3 :(得分:0)

备用版本是使用带有构造函数的对象和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']);
});

Fiddle