当前位置: 首页 > 面试题库 >

如何在Javascript中clone对象数组?

郑宏朗
2023-03-14
问题内容

…每个对象还引用了同一数组中的其他对象吗?

当我第一次想到这个问题时

var clonedNodesArray = nodesArray.clone()

将存在并搜索有关如何在javascript中克隆对象的信息。我确实在StackOverflow上发现了一个问题(由相同的@JohnResig回答),他指出,使用jQuery,您可以做到

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

clone对象。我尝试了一下,但这只复制了数组中对象的引用。所以如果我

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

nodeArray [0]和clonedNodesArray [0]的值都将变为“绿色”。然后我尝试

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

它深深复制了一个对象,但是我分别从Firebug和Opera Dragonfly 得到了“ 太多的递归 ”和“ 控制堆栈溢出html" target="_blank">消息

你会怎么做?这是什至不应该做的事情吗?有没有一种可重用的方式来做到这一点在Javascript中?


问题答案:

浅表副本的问题是未clone所有对象。尽管每个对象的引用在每个数组中都是唯一的,但是一旦最终抓住它,您将像以前一样处理同一对象。clone它的方式没有错…使用Array.slice()会产生相同的结果。

您的深层副本有问题的原因是因为您最终得到了循环对象引用。Deep将尽可能深入,如果您有一个圆圈,它将无限循环直到浏览器晕倒为止。

如果数据结构不能表示为有向无环图,那么我不确定您是否能够找到用于深度clone的通用方法。循环图提供了许多棘手的极端情况,由于这不是常见的操作,我怀疑有人编写了完整的解决方案(如果可能的话-可能不是!但是我现在没有时间尝试编写严格的证明。)。在此页面上,我对此问题发表了一些好的评论。

如果您需要带有循环引用的对象数组的深层副本,我相信您将必须编写自己的方法来处理您的专用数据结构,例如多遍clone:

  1. 在第一轮中,clone所有不引用数组中其他对象的对象。跟踪每个对象的起源。
  2. 在第二轮中,将对象链接在一起。


 类似资料:
  • 本文向大家介绍javascript中clone对象详解,包括了javascript中clone对象详解的使用技巧和注意事项,需要的朋友参考一下   开发中,打断对象间的引用关系,只想下个副本的情况无处不在,clone一个对象就在所难免了。   JavaScript中,简单的方法就是用JSON函数,将对象stringify成字符串,再parse成一个新对象。要么就是从网上搜个代码,开源社区里面clo

  • 问题内容: 我有一个对象数组: 如何通过JavaScript将其转换为以下内容? 问题答案: 您可能正在寻找这样的东西:

  • 我有这个对象,我需要过滤它。 我只需要在“数据”中输入“isEnabled”为真的值的ID

  • 问题内容: 我有两个对象数组。我想基于PermissionObj过滤数据。 这是即将形成的数据库。这是permissionObj中的子数组的数组。 这是静态数据。我想比较基于PermissionObj的数据。 我正在尝试基于 对象 的 PermissionObj数组 过滤 对象 的 数据数组 。这是我尝试的代码。 如果PermissionObj值将与data值匹配。然后显示数据。 我接受的输出将是

  • 问题内容: 想要改善这篇文章吗? 提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 JavaScript中的对象是一个奇怪的疣-在大多数情况下,它的行为就像一个数组,但实际上不是数组对象。因为它是真正的完全是另一回事,它没有从有用的功能类似,,,和。 使用一个简单的for循环从arguments对象构造新数组非常容易。例如,此函数对其参数进行排序: 但是,仅获

  • 我要转换如下所示的对象: 键值对的数组,如下所示: 如何在JavaScript中将对象转换为键值对数组?