我有两个数组,我想将一些元素从Ar1推送到Ar2并保留引用

时间:2016-07-29 12:01:54

标签: javascript arrays angularjs

我需要使用两个带有angularjs的javascript数组。 我想将一些元素从Ar1推送到Ar2,之后如果我在Ar2中更改这些元素的值,我希望自动更改Ar1中的值。

2 个答案:

答案 0 :(得分:0)

你做不到。一个数组中的与另一个数组中的相同值之间没有链接。 E.g:

var a1 = [42];
var a2 = [];
a2.push(a1[0]);

...在内存中给我们这个结构:

       +---------+
a1---->| (array) |
       +---------+   
       | 0: 42   |
       +---------+

       +---------+
a2---->| (array) |
       +---------+   
       | 0: 42   |
       +---------+

a1中的42与a2中的42之间没有链接。

一种替代方法是两个数组都有对象的引用,并使用这些对象的属性而不是数组中包含的条目。由于两个数组都引用相同的对象,因此通过另一个数组中的引用可以访问一个数组中引用的更改。

E.g:

var a1 = [{foo:"bar"}];
var a2 = [];
a2.push(a1[0]);
console.log(a1[0].foo); // "bar"
a2[0].foo = "updated";
console.log(a1[0].foo); // "updated"

这是有效的,因为这段代码:

var a1 = [{foo:"bar"}];
var a2 = [];
a2.push(a1[0]);

在内存中设置此结构:

       +------------+
a1---->|  (array)   |
       +------------+   
       | 0: ref5542 |----+
       +------------+    |
                         |     +------------+
       +------------+    +---->|  (object)  |
a2---->|  (array)   |    |     +------------+
       +------------+    |     | foo: "bar" |
       | 0: ref5542 |----+     +------------+
       +------------+    

两个数组都引用了相同的对象,因此无论您如何查找对象,都会显示更改该对象的状态。

答案 1 :(得分:-1)

如果在数组中推送引用类型变量,则每个地方都将使用相同的引用。

var a1 = [{a:10,b:20}];
var a2 = [];
a2.push(a1[0]);
console.log(a1,a2) //outputs {a:10,b:20}, {a:10,b:20}
a2[0].a = 30;
console.log(a1,a2) //outputs {a:30,b:20}, {a:30,b:20}

如果变量值是基本类型,则同样的事情将不起作用。例如,数字,字符串,布尔等。