当数组具有自定义属性时的angular.copy

时间:2015-12-16 15:14:14

标签: javascript arrays angularjs copy

请考虑以下示例:

var ar = [4, 2, 3];
ar.$x = 'something';
var br = angular.copy(ar);
console.dir(br);

br不再具有$x属性,因为在复制数组时,angular会使用for (;;;)进行迭代,但不会看到自定义属性(如果它使用for in进行迭代,那么它会起作用。)

我应该做以下哪一项?

  1. 像类一样创建数组,然后赋值属性;
  2. 如果是错误,请向angular报告;
  3. 更改我的代码,因为将属性赋值给数组并不是一种好习惯;

3 个答案:

答案 0 :(得分:5)

试试angular.merge() 这是一个包含可枚举属性的深层副本。

var ar = [4, 2, 3];
ar.$x = 'something';
var br = angular.merge([], ar);
console.dir(br);

输出

Array[3]
  0: 4
  1: 2
  2: 3
  $x: "something"
  length: 3
  __proto__: Array[0]

答案 1 :(得分:2)

我认为这不是一个角度问题。如果你这样说的话:

ar.$x = 'something';
console.log(Object.prototype.toString.call(ar));

您将看到将记录[object Array]。这就是Array.isArray()方法的工作原理,反过来,这就是角copy()方法如何决定如何遍历作为参数传递的实体。这种检测至关重要,因为阵列上的for ... in循环可能会在其他情况下产生一些混淆。这里描述了原因:Why is using "for...in" with array iteration a bad idea?

对于这种特殊情况,我建议您更改代码。

答案 2 :(得分:1)

尝试使用jQuery:

jQuery.extend([],ar);

var ar = [4, 2, 3];
ar.$x = 'something';
var br = jQuery.extend([], ar);
console.dir(br);