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; }

谢谢您的链接!