如果深度复制有效,输出将是“好奇的乔治”,而不是“安德的游戏”。我怎样才能制作深层照片?对this question的回答表明$.extend(true, [], obj)
创建了深层副本。然而我的例子表明它没有。
function Person(){}
Person.prototype.favorite_books = [];
var george = new Person();
george.favorite_books = ["Curious George"];
var kate = new Person();
kate.favorite_books = ["The Da Vinci Code", "Harry Potter"];
var people = [kate, george];
var people_copy = $.extend(true, [], people);
people_copy[0].favorite_books[0] = "Ender's Game";
$('#text').text(people[0].favorite_books[0]);
解
我更新了jsFiddle。事实证明,我需要单独深度复制数组中的每个对象如果对象是自定义对象(即$.isPlainObject
返回false)。
答案 0 :(得分:18)
现在这里是真正的答案:
目前,jQuery只能克隆纯JavaScript对象,而您使用的是自定义JavaScript对象。这很明显,因为jQuery无法知道如何实例化一个新的自定义对象。所以这可以按预期工作:
var george = {};
george.favorite_books = ["Curious George"];
var kate = {};
kate.favorite_books = ["The Da Vinci Code", "Harry Potter"];
var people = [kate, george];
var people_copy = $.extend(true, [], people);
console.log(people_copy[0].favorite_books == people[0].favorite_books);
引用jQuery代码:https://github.com/jquery/jquery/blob/master/src/core.js#L305
看到它检查它是jQuery.isPlainObject(copy)
还是数组。否则它只执行参考副本。
答案 1 :(得分:7)
这是我在尝试多种方法后完成它的方式:
var newArray = JSON.parse(JSON.stringify(orgArray));
这将创建一个新的深层副本,而不是浅层副本。
此外,这显然不会克隆事件和函数,但好处是你可以在一行中完成它,它可以用于任何对象之王(数组,字符串,数字,对象等)。 / p>
答案 2 :(得分:3)
有趣......它看起来不像是深拷贝数组。
您必须单独深度复制每个对象。
var people_copy = [];
$.each(people,function(i,obj) {
people_copy.push($.extend(true,{},obj));
});
编辑:当然,看看OP的小提琴: