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

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

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中是否有可重用的方法来做到这一点?


当前回答

$.evalJSON($.toJSON(origArray));

其他回答

我的方法:

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

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

数组中。Slice可以用来复制一个数组或数组的一部分…

这将与字符串和数字工作..-改变一个数组中的字符串不会影响另一个数组-但对象仍然只是通过引用复制,所以改变一个数组中引用的对象会影响另一个数组。

下面是一个JavaScript撤销管理器的示例,它可能对此很有用:http://www.ridgway.co.za/archive/2007/11/07/simple-javascript-undo-manager-for-dtos.aspx

我使用新的ECMAScript 6对象。分配方法:

let oldObject = [1, 3, 5, "test"];
let newObject = Object.assign({}, oldObject);

该方法的第一个参数是要更新的数组。我们传递一个空对象,因为我们想要有一个新对象。

我们也可以使用这个语法,它是相同的,但更短:

let newObject = [...oldObject];

此方法非常简单,您可以在不修改原始数组的情况下修改克隆。

//原始数组 让数组=[{名称:“拉斐尔”},{名称:' Matheus '}); //克隆阵列 让clone = array。Map (a => {return{…a}}) //编辑克隆数组 克隆[1].name = 'Carlos'; console.log(数组,数组) // [{name: 'Rafael'}, {name: 'Matheus'}] console.log(克隆,克隆) // [{name: 'Rafael'}, {name: 'Carlos'}]

jQuery:

var target = [];
$.each(source, function() {target.push($.extend({}, this));});