我有一个名为 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"}
]
};
我的问题是:“为什么修改新数组会改变旧数组?”
答案 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);
a
和b
引用相同的对象,因此,当您修改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);
这适用于您的arr
和new_arr
。
答案 3 :(得分:-1)
可能是因为arr是一个对象而且 var new_arr = arr 只是将它的引用分配给new_arr?试试这个 new_arr = arr.clone()