为什么过滤新的JSON对象导致旧的JSON对象自我更新?

时间:2011-09-21 14:08:05

标签: javascript jquery json

我有一个名为 arr 的JSON数组和一个名为 new_arr 的新数组,该数组是从 arr 创建的。

var arr = {"data":
 [
  {"name":"Alan","height":"171","weight":"66"},
  {"name":"Ben","height":"182","weight":"90"},
  {"name":"Chris","height":"163","weight":"71"}
 ]
};

var new_arr = arr;

new_arr.data = jQuery.grep(new_arr.data, function(n, i){
  return n.weight > 70;
});

数组 arr new_arr 变为:

{"data":
 [
  {"name":"Ben","height":"182","weight":"90"},
  {"name":"Chris","height":"163","weight":"71"}
 ]
};

我的问题是:“为什么修改新数组会改变旧数组?

4 个答案:

答案 0 :(得分:5)

没有新阵列。它只是对旧阵列的新参考 在另一个例子中尝试:

var a = {};
var b = a;
// check to see if they are equal
alert(a === b);
// modify one of them 
b.foo = 'bar';
 // check to see if they are equal
alert(a === b);
// modify one of them 
a.bar = 'foo';
 // check to see if they are equal
alert(a === b);

ab引用相同的对象,因此,当您修改a时,您也会修改b,依此类推。

如果使用jquery,则应使用extend方法:

var new_arr = $.extend(true,arr);

答案 1 :(得分:2)

执行时,您将引用相同的数组:

var new_arr = arr;

如果您需要副本,则需要制作副本:

var new_arr = arr.data.slice( 0 ); // 0 is the optional starting index of the copy

这只是对数组进行浅层复制,因此嵌套对象将被两者引用。

如果需要对所有嵌套对象进行深度克隆,则需要遍历每个单独的对象并进行复制。

答案 2 :(得分:1)

您应该克隆您的数组。我从John Resig over here复制了这个。有关更多解释,请参阅他的帖子。

// Shallow copy
var newObject = jQuery.extend({}, oldObject);

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);

这适用于您的arrnew_arr

答案 3 :(得分:-1)

可能是因为arr是一个对象而且     var new_arr = arr 只是将它的引用分配给new_arr?试试这个     new_arr = arr.clone()