jquery.extend(true,[],obj)不创建深层副本

jsFiddle在这里。

如果深层复制工作,输出将是“好奇乔治”,而不是“恩德的游戏”。 我怎样才能做一个深层复制? 对这个问题的回答表明$.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),我需要深度复制数组中的每个对象。


现在这是真正的答案:

目前jQuery只能克隆普通的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)还是数组。 否则它只执行参考副本。


这是我尝试了很多方法之后做到的:

var newArray = JSON.parse(JSON.stringify(orgArray));

这将创建一个新的深层副本,而不是浅拷贝。

此外,这显然不会克隆事件和函数,但好处是可以在一行中完成,并且可以用于任何对象的王(数组,字符串,数字,对象等)。


有趣....它看起来不像它深拷贝数组。

您必须单独深度复制每个对象。

var people_copy = [];
$.each(people,function(i,obj) {
    people_copy.push($.extend(true,{},obj)); 
});

编辑:当然,看看OP的小提琴的这个叉子:

http://jsfiddle.net/s2bLv/4/

链接地址: http://www.djcxy.com/p/80917.html

上一篇: jquery.extend(true, [], obj) not creating a deep copy

下一篇: Highcharts not rendering in jQuery tooltip