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_对象
。