2017-01-06 38 views
0

我需要在javascript中创建一个数组的副本,以便两个数组的地址应该不同。如何能不能做到..角js - 复制对象没有被引用被复制

我已经试过

$scope.users = data.users; 
$scope.usersTemp = []; 
$scope.usersTemp.push($scope.users); 

and 
$scope.usersTemp = $scope.usersTemp 
+1

可能出现[Deep Copy Objects in angular?](http:// stackoverflow。com/questions/14360401/deep-copying-objects-in-angular) – Mistalis

回答

0

您可以使用:

angular.copy (myObjorArrayetc) 
0

你正在尝试做的似乎是建立一个JS数组的浅拷贝。 如果这不是你的用例,请让我知道。

有几种方法在JS做到这一点

const copy = [...original]; // es6 only, uses Symbol.iterator 
const copy = original.slice(); // slices the array from index 0,  
           // returning a shallow copy 

const copy = Array.from(original, val => val); // es6 only, takes an 
// array-like object with .length property and a map function 
const copy = original.map(x => x); 
// call to Array.prototype.map with identity function. 

有了这些,你可以有:

const a = [1, 2]; 
const b = // shallow copy with one of the methods 
a.push(3); // and b is still [1, 2] 

关于其他的答案快速注意:快速看角文档here似乎以指示angular.copy返回一个深拷贝

掌握它们之间的差异非常重要:浅拷贝只会创建一个新对象并将所有值放入其中,而深拷贝将尝试复制每个值。这意味着,因为JS中的对象是可变的,所以如果你创建一个浅拷贝,你仍然可以将其所有值与其他拷贝共享。深拷贝不是这种情况。

e.g:

const a1 = [{a: {b: 3}}]; 
const a2 = // shallow copy 
(a1 === 2) // false 
a1[0].a.b = 4 // reassign a prop of a value contained inside a1 
(a1[0].a.b === 4) // true 

如果深拷贝已经作出,一个新的对象就已经作出。

结论:根据您的用例使用您需要的内容。浅拷贝很快就会被制作出来,但会受到不必要的突变,深拷贝的创建成本要高得多,但不会受共享访问所导致的突变的影响。作为一个侧面说明,当然这两种方法对GC的影响(意思是浅拷贝不会释放对原始值中包含的值的引用)。

+0

当你知道一个工作的解决方案时,这是猜测的答案 – cske

+0

我可能会误解,但问题是“在javascript中制作一个数组的副本,这两个数组应该是不同的“意味着给我一个数组的浅拷贝。 每条线都这样做。 – adz5A

0

您可以使用

var copy = angular.copy(object);

它将使对象的确切副本。

0

在数组的情况下使用赋值操作时,副本和原始对象绑定更改。所以使用angular.copy(oldArray, newArray)