Javascript Angular.copy()不深度复制引用的数组

Javascript Angular.copy()不深度复制引用的数组,javascript,angularjs,reference,deep-copy,shallow-copy,Javascript,Angularjs,Reference,Deep Copy,Shallow Copy,在我的角度应用程序中,我有一个数组,它引用多边形的坐标。例如: [-1,0],[0,1],[1,0],[0,-1],-1,0] 这里重要的一点是,第一个点和最后一个点是重复的,并且实际上引用相同的2长度数组。这是我使用的一个插件的结果。但是,有时数组的创建方式会使第一个点和最后一个点具有相同的值,但不是相同的引用 在我的角度应用程序中的某一点上,我需要创建一个与原始多边形具有相同坐标的新多边形,仅翻转。我的第一次尝试是: var newCoords = angular.copy(polygon.

在我的角度应用程序中,我有一个数组,它引用多边形的坐标。例如:

[-1,0],[0,1],[1,0],[0,-1],-1,0]

这里重要的一点是,第一个点和最后一个点是重复的,并且实际上引用相同的2长度数组。这是我使用的一个插件的结果。但是,有时数组的创建方式会使第一个点和最后一个点具有相同的值,但不是相同的引用

在我的角度应用程序中的某一点上,我需要创建一个与原始多边形具有相同坐标的新多边形,仅翻转。我的第一次尝试是:

var newCoords = angular.copy(polygon.coordinates);
for (var i = 0; i < newCoords.length; i++) {
  newCoords[i].reverse();
}
var newCoords=angular.copy(polygon.coordinates);
对于(var i=0;i
然而,在第一个坐标和最后一个坐标具有相同参考的情况下,我最终发现其中一个点被反转了两次


我的理解是,
angular.copy()
会创建传入内容的深度副本,我不应该遇到这个问题。显然这是不正确的,为什么?有没有办法对坐标数组进行真正的深度复制,从而消除这种奇怪的引用对?目前,我通过在
reverse()

之前添加一个额外的
angular.copy(newCoords[I])
来解决这个问题,正如评论中所建议的,这与angular核心内部的变化有关。这一变化于年发布。错误修复程序列为:

angular.copy:在要复制的值中支持循环引用 (,)

但是,除了循环引用之外,还处理双重引用。为了故意不处理双重引用,您有几个选项。正如你在文章中提到的,在完成复制后,重新复制第一个索引。不是特别直观,但在任何情况下都可以正常工作:

var newCoords = angular.copy(polygon.coordinates);
// Ensure unique reference for the first element
newCoords[0] = angular.copy(newCoords[0]);
另一种选择是只使用v1.2.17之前的任何Angular版本(甚至返回到v0.9.0),因为它们的默认行为是为每个引用创建两个不同的克隆


对于可能需要进行深度复制,但不知道重复引用的确切位置(甚至可能在子对象中)的其他人,还有另一种方法可以用于v1.4.8之前的角度版本。这是将第三个参数传递到copy中,以禁用循环引用处理。请注意,这也适用于v1.2.17之前的所有版本,因为它们将忽略第3个参数并执行其默认行为:

var stackSource = angular.extend([], {push:angular.noop});
var newCoords = angular.copy(polygon.coordinates, null, noopArray);

第三个参数是未记录的
堆栈源代码
。通过重写它的push方法不做任何事情,循环引用检测被破坏。需要注意的两件重要事情是,周期性引用将出错(如v1.2.16及以下版本),由于性能变化,这在v1.4.8及以上版本中不起作用。在这种情况下,您必须编写自己的深度复制函数

你能重现这个问题吗?对我来说,是在使用相同的参考资料,你有这样的东西吗?这一定是angular.copy()在我的应用程序版本angular中的错误。如果你看这里(),它会按预期打印出
false-true-false
。当我将代码准确地复制到我的应用程序中时,它会打印出
false-true-true
。实际上,这似乎是Angular 1.2.1(JSFIDLE)和Angular 1.2.19(我的应用程序)之间的错误修复。这取决于深度副本的定义是否包括在新对象中维护相对引用。angular.copy文档可能会更清楚地说明这一点。您是对的,在JSFIDLE中更改angular的版本后,我得到的结果与您得到的结果相同:false-true-true..也许这可能是相关的(在1.3中介绍):