【问题标题】:comparing original array with a deep clone, not working将原始数组与深层克隆进行比较,不起作用
【发布时间】:2014-03-29 06:37:54
【问题描述】:

我正在尝试测试我的数组的深层克隆是否与原始对象相同(可用 jQuery)。

这是我克隆它的方法

self.slides = jQuery.extend(true, {}, parent.modules[self.moduleId].composed);

但是,我最终得到了两个稍微不同的对象,所以即使我关心的实际内容是相同的,这两个对象也不是。如果我将它们转储到 chrome 控制台中,它们的外观是这样的:

原始对象:

[Object]
0: Object
length: 1
__proto__: Array[0]

克隆:

Object {0: Object}
0: Object
__proto__: Object

所以克隆看起来实际上是一个对象(或对象类型的对象),而原始对象似乎是一个数组(或数组类型的对象)。

是否有其他克隆方式或如何执行此相同测试?

【问题讨论】:

  • ArrayObject的一个类型,如果克隆算法不知道要创建一个新的Array,它将“退回”到创建一个通用的Object。此外,您是extending,这与制作克隆有点不同。

标签: javascript arrays object clone


【解决方案1】:

克隆任何对象的最简单方法是

var array1 = [1, [2], 3];
var array2 = JSON.parse(JSON.stringify(array1));

你可以像这样检查它们

console.log(array1, array2);
// [ 1, [ 2 ], 3 ] [ 1, [ 2 ], 3 ]

array1[1][0] += 3;

console.log(array1, array2);
// [ 1, [ 5 ], 3 ] [ 1, [ 2 ], 3 ]

【讨论】:

  • 我接受了您的建议,现在我的应用程序按预期运行,谢谢。但是,我确实尝试了多种非 JSONstringify 方法来比较两个结果数组,但没有一个对我有用(即使是投票率很高的答案),我可以在相等性测试中获得正确的唯一方法是将两个数组都转换为字符串( JSONstringify)...奇怪。
【解决方案2】:

这是因为您传递了一个对象“{}”扩展器来尝试以这种方式克隆,我相信它会好得多

var clone = myArray.slice(0);

【讨论】:

  • 但是我在原始数组中可能拥有的所有对象都不会被克隆,而只会被克隆引用,对吧?这是不可接受的,因为我需要能够更改原始数组的内容而不影响克隆(我克隆的全部目的)。
  • 不要。你正在做的是用这个“parent.modules [self.moduleId].composed”的值扩展这个对象“{}”。它们是不同的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 2012-07-29
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多