【发布时间】:2015-01-22 07:19:08
【问题描述】:
在我的 Angular 应用程序中,我有一个引用多边形坐标的数组。例如:
[[-1,0], [0,1], [1,0], [0,-1], [-1,0]]
这里重要的一点是第一个点和最后一个点是重复的,并且实际上引用了 same 2-length 数组。这是我正在使用的插件的结果。但是,有时会以这样的方式创建数组,即第一个点和最后一个点虽然具有相同的值,但不是相同的引用。
在我的 Angular 应用程序的某个点,我需要创建一个新的多边形,它的坐标与原始多边形相同,只是翻转了。我的第一次尝试是这样的:
var newCoords = angular.copy(polygon.coordinates);
for (var i = 0; i < newCoords.length; i++) {
newCoords[i].reverse();
}
但是,在第一个坐标和最后一个坐标具有相同参考的情况下,我的结果是其中一个点被反转了两次。
我的理解是angular.copy() 创建了传入的任何内容的深层副本,我不应该遇到这个问题。显然这是不正确的,为什么呢?有没有办法对坐标数组进行 真正 深层副本,以消除奇怪的参考配对?我现在设法通过在reverse() 之前添加一个额外的angular.copy(newCoords[i]) 来解决它。
【问题讨论】:
-
你能重现这个问题吗?对我来说,我正在使用相同的参考资料,你有这样的东西吗? jsfiddle.net/rahpuser/2ngtw4bw/2
-
在我的应用程序的 angular 版本中一定是 angular.copy() 的错误。如果您看这里 (jsfiddle.net/2ngtw4bw/4),则会按预期打印出
false true false。当我将该代码完全复制到我的应用程序中时,它会打印出false true true。 -
实际上,这似乎是 Angular 1.2.1(jsfiddle)和 Angular 1.2.19(我的应用程序)之间的错误 fix。这取决于您对深拷贝的定义是否包括在新对象中维护相对引用。 angular.copy 文档可能会更清楚地说明这一点。
-
你是对的,在 jsfiddle 中更改 angular 版本后,我得到的结果与你相同:false true true..
-
也许这可能是相关的(在 1.3 中引入):github.com/angular/angular.js/commit/…
标签: javascript angularjs reference deep-copy shallow-copy