Javascript 使用对象切片数组并使用对象副本获取数组
当我制作一个包含对象的数组切片时,新数组仍然引用初始数组中的对象。如何使用对象副本制作切片Javascript 使用对象切片数组并使用对象副本获取数组,javascript,arrays,javascript-objects,slice,Javascript,Arrays,Javascript Objects,Slice,当我制作一个包含对象的数组切片时,新数组仍然引用初始数组中的对象。如何使用对象副本制作切片 var obj1 = {name: 'object1'}; var obj2 = {name: 'object2'}; var array = [obj1, obj2]; var arraySlice = array.slice(0, 1); arraySlice[0].name = 'object1RENAMED'; console.log(array[0].name); console.log(arr
var obj1 = {name: 'object1'};
var obj2 = {name: 'object2'};
var array = [obj1, obj2];
var arraySlice = array.slice(0, 1);
arraySlice[0].name = 'object1RENAMED';
console.log(array[0].name);
console.log(arraySlice[0].name);
印刷品:
object1RENAMED
object1RENAMED
在我们的例子中,对值的引用是相同的(值是对象),这就是为什么可以更改不同数组中的值。您需要创建深度克隆/副本:
var arraySlice = JSON.parse(JSON.stringify(array.slice(0, 1)));
如果您使用jQuery,您可以这样做
var arraySlice = $.extend(true, [], array.slice(0, 1));
演示:您正在制作数组的浅拷贝,而不是深拷贝,因此两个数组仍然引用相同的对象。您还需要克隆对象
var arraySlice = JSON.parse(JSON.stringify(array.slice(0, 1)));
我从我的计算机上获取了这个克隆代码
这是一个递归函数(
cloneObj
),它可以让您的生活更轻松。它使用Array.map
在所有级别上克隆Array
中的对象
var数组=[{name:'object1'},{name:'object2'}];
log2Screen('array initially:
'+Object.print(array));
var arraySlice=cloneObj(数组);
//更改克隆中的名称:
arraySlice[0]。name=“已更改”;
arraySlice[1].name=“演示”;
arraySlice[1].addedProp=[{a:1,b:2},{a:2,b:3}];
Helpers.log2Screen('arraySlice(克隆,更改):
'+Object.print(arraySlice));
log2Screen('数组没有改变,仍然:
'+Object.print(数组));
函数cloneObj(obj){
//克隆整个enchillada,递归
功能克隆(o,curr){
用于(变量l在o中){
如果(!o.hasOwnProperty(l)){continue;}
if(对象的o[l]实例){
curr[l]=cloneObj(o[l]);
}否则{
curr[l]=o[l];
}
}
返回货币;
}
返回数组的obj实例
?obj.slice().map(函数(v){return cloneObj(v);})
:obj instanceof Date
?新日期(obj.getTime())
:obj对象实例
?克隆(obj,{})
:obj;
}
谢谢您的链接!