当前位置: 首页 > 知识库问答 >
问题:

jquery.extend(true,[], obj)没有创建深度副本

宇文峰
2023-03-14

jsFiddle这里。

如果深度复制奏效,输出将是“好奇的乔治”,而不是“安德的游戏”。怎么做深度文案?这个问题的答案表明$.延伸(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)。

共有3个答案

东方琪
2023-03-14

有趣的它看起来不像是深度复制阵列。

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

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

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

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

钮高朗
2023-03-14

在尝试了许多方法后,我是这样做的:

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

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

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

魏英勋
2023-03-14

现在是真正的答案:

目前,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(复制)还是一个数组。否则,它只执行引用副本。

 类似资料:
  • 我不确定我的问题是出在代码的深度复制部分,还是我在将元素添加到原始列表时犯了错误。到目前为止我所掌握的是: ...其中与此相关联的测试用例是:

  • 因此,我有一个基本的树结构,该结构由树节点组成,该树节点链接到具有父级和子级引用的其他树节点。我想创建一个方法,该方法返回一个 Stream,该流从叶节点流式传输到根节点或从根到叶。我已经实现了这个,但我正在寻找一种创建最少对象的解决方案。最好没有。这是我的代码: 这很好,但我的“问题”是,为每个流调用创建了很多对象。 StreamSupport.stream 创建新的 ReferencePipe

  • 我一直在尝试使用springboot和flyway创建一个web应用程序。构建工具是Gradle。然而,当我尝试运行程序时,Flyway只创建了一个名为Flyway_schema_hystory的表,但不从SQL脚本创建表。脚本<code>V1__Create_all_tables。sql位于正确的包中。<code>构建中的依赖项。添加了gradle</code>,在<code>应用程序中添加了f

  • 问题内容: 我正在尝试创建由AVCaptureVideoDataOutputSampleBufferDelegate中的captureOutput返回的CMSampleBuffer的副本。 由于CMSampleBuffers来自(15)个缓冲区的预分配池,因此,如果我对它们附加引用,则无法重新收集它们。这将导致所有剩余的帧被丢弃。 为了保持最佳性能,某些样本缓冲区直接引用了可能需要由设备系统和其他

  • 问题内容: 我正在尝试从深度嵌套的JSON字符串创建单个Pandas DataFrame对象。 JSON模式是: 期望的结果 我需要将其展平以产生一张桌子: 第一列是值,其余列是键的值并存储在列表中。 到目前为止,我已经 是一个列表,其中长度等于个人数量,即。df对象只是返回 如何遍历该列表以获取dict值并创建N个不同的列?我应该尝试为该列表创建一个DataFrame ,重塑它的形状,然后用角色

  • 我有一个间接使用类Foo的测试用例。对于测试用例,我不在乎Foo是什么。我应该可以嘲笑它。 然而,testcase使用一个库来调用Foo上的一些方法。其中一些方法返回对象,然后该库对这些返回的对象调用一些方法。就本测试而言,这些对象是什么并不重要,只是它们不是null,并且不会导致NullPointerException。 对于该库调用的每个对象和方法,我已经经历并添加了一系列类似以下的expec

  • 我有复选框数组使用不同id的映射,所以不能为状态检查设置反应钩子,我尝试使用另一种方式,但仍然没有找到答案。我使用React-bootstrap的react钩子。

  • 问题内容: PHP数组可以为其元素包含数组。这些数组可以具有数组,依此类推。有没有办法找出PHP数组中存在的最大嵌套?一个示例是一个函数,如果初始数组不具有数组作为元素,则返回1;如果至少一个元素是数组,则返回2,依此类推。 问题答案: 应该这样做: 编辑:非常快速地测试了它,它似乎可以工作。