…每个对象在同一个数组中也有对其他对象的引用?

当我第一次想到这个问题的时候,我就想到了

var clonedNodesArray = nodesArray.clone()

并搜索如何在JavaScript中克隆对象的信息。我确实在Stack Overflow上找到了一个问题(同样由@JohnResig回答),他指出用jQuery你可以做到

var clonedNodesArray = jQuery.extend({}, nodesArray);

克隆对象。虽然我尝试了这个,但这只复制了数组中对象的引用。如果我

nodesArray[0].value = "red"
clonedNodesArray[0].value = "green"

nodesArray[0]和clonedNodesArray[0]的值将显示为“绿色”。然后我尝试了

var clonedNodesArray = jQuery.extend(true, {}, nodesArray);

它深度复制了一个对象,但我分别从Firebug和Opera Dragonfly得到了“太多递归”和“控制堆栈溢出”的消息。

你会怎么做?这是不应该做的事情吗?在JavaScript中是否有可重用的方法来做到这一点?


当前回答

我们可以发明一个简单的递归数组方法来克隆多维数组。虽然嵌套数组中的对象保持对源数组中相应对象的引用,但数组不会。

Array.prototype.clone = function(){ 返回。map(e => Array.isArray(e) ?e.clone(): e); }; var arr =[1、2、3、4(1、2(1、2、3),4、5],6], BRR = arr.clone(); Brr [4][2][1] = " 2 "; console.log (JSON.stringify (arr)); console.log (JSON.stringify (brr));

其他回答

如果你只需要一个浅拷贝,一个非常简单的方法是:

new_array = old_array.slice(0);

我的方法:

var temp = { arr : originalArray };
var obj = $.extend(true, {}, temp);
return obj.arr;

给我一个漂亮的,干净的,深克隆的原始数组-没有对象引用回原始:-)

我用Object.assign解决了克隆对象数组的问题

const newArray = myArray.map(a => Object.assign({}, a));

如果使用扩展语法,甚至更短

const newArray = myArray.map(a => ({...a}));

我想我们可以做到->

let a = [{name: "mike"}, {name: "ron"}];
let copy_a = [...a];

如果你只需要一个浅克隆,最好的方法如下:

使用…ES6扩展运算符。

这里有一个最简单的例子:

var clonedObjArray = [...oldObjArray];

通过这种方式,我们将数组扩展为单独的值,并使用[]操作符将其放入一个新数组中。

下面是一个更长的例子,展示了它的不同工作方式:

let objArray = [ {a:1} , {b:2} ]; let refArray = objArray; // this will just point to the objArray let clonedArray = [...objArray]; // will clone the array console.log( "before:" ); console.log( "obj array" , objArray ); console.log( "ref array" , refArray ); console.log( "cloned array" , clonedArray ); objArray[0] = {c:3}; console.log( "after:" ); console.log( "obj array" , objArray ); // [ {c:3} , {b:2} ] console.log( "ref array" , refArray ); // [ {c:3} , {b:2} ] console.log( "cloned array" , clonedArray ); // [ {a:1} , {b:2} ]