我正在使用Google Script中的2D数组。我遇到了一个我无法解决的问题。当我尝试更改2D数组中的单个数组元素时,其他值也会发生变化......有人可以告诉我我做错了什么吗?
以下是一个高度简化的示例:
function arrayproblem() {
var arrayone = ["A","B","C","D","E"];
var bigarray = [];
bigarray.push(arrayone);
bigarray.push(arrayone);
bigarray.push(arrayone);
bigarray.push(arrayone);
bigarray.push(arrayone);
bigarray[3][3]="HELLO";
Logger.log(bigarray);
}
我清楚地指出只有元素[3] [3]被改为“HELLO”,但是数组中的每个[3] rd元素都被改变了。输出是:
[ “A”, “B”, “C”, “HELLO”, “E”]
[ “A”, “B”, “C”, “HELLO”, “E”]
[ “A”, “B”, “C”, “HELLO”, “E”]
[ “A”, “B”, “C”, “HELLO”, “E”]
[ “A”, “B”, “C”, “HELLO”, “E”]
为什么它将“HELLO”写入元素[0] [3],[1] [3],[2] [3],[3] [3]和[4] [3] ?? < / p>
我正试图解决这个问题,但不能:
[ “A”, “B”, “C”, “d”, “E”]
[ “A”, “B”, “C”, “d”, “E”]
[ “A”, “B”, “C”, “d”, “E”]
[ “A”, “B”, “C”, “HELLO”, “E”]
[ “A”, “B”, “C”, “d”, “E”]
请帮忙!非常感谢。
答案 0 :(得分:0)
试试这个:
function arrayproblem() {
var bigarray = [];
bigarray.push(["A","B","C","D","E"]);
bigarray.push(["A","B","C","D","E"]);
bigarray.push(["A","B","C","D","E"]);
bigarray.push(["A","B","C","D","E"]);
bigarray.push(["A","B","C","D","E"]);
bigarray[3][3]="HELLO";
Logger.log(bigarray);
}
在原始代码中,您不是将arrayone的副本推送到bigarray,而是将arrayone的同一个实例多次推送到bigarray中。我的意思是,bigarray会收到许多对同一个对象的引用。
答案 1 :(得分:0)
这是按引用调用和按值调用之间的差异。在通过引用调用时,它会映像它共享变量。在按值调用时,它会复制变量的图像。在javascript中,对象数据类型,即数组,切片,关联数组等,以及原始数据类型,即number,string和bool,分别是前者和后者。
您的脚本是前者。
例如,它通过引用显示调用的简单示例。
var ar1 = [0,0,0,0,0];
var ar2 = ar1;
ar2[3] = 1;
Logger.log(ar1)
Logger.log(ar2)
在这种情况下,ar1
和ar2
都会成为[0.0, 0.0, 0.0, 1.0, 0.0]
。 ar1
和ar2
都由ar2[3] = 1
更改。因为这是通过引用的呼叫。
为了通过引用和按值调用来修改,它使用concat()
将ar1
复制到ar2
,如下所示。使用concat()
只是其中一个示例。当然,您可以像@André的提案一样实现价值呼叫。
var ar1 = [0,0,0,0,0];
var ar2 = ar1.concat();
ar2[3] = 1;
Logger.log(ar1)
Logger.log(ar2)
在这种情况下,ar1
和ar2
分别为[0.0, 0.0, 0.0, 0.0, 0.0]
和[0.0, 0.0, 0.0, 1.0, 0.0]
。 concat()
是一种复制数组的方法。
此处,当它看到您的脚本时,arrayone
会使用bigarray
导入push()
。这是通过引用的呼叫。因此,bigarray
中的所有元素都会被bigarray[3][3]="HELLO"
更改。
当使用concat()
将脚本修改为按值调用时,它将如下所示。
修改过的脚本:
function arrayproblem() {
var arrayone = ["A","B","C","D","E"];
var bigarray = [];
bigarray.push(arrayone.concat());
bigarray.push(arrayone.concat());
bigarray.push(arrayone.concat());
bigarray.push(arrayone.concat());
bigarray.push(arrayone.concat());
bigarray[3][3]="HELLO";
Logger.log(bigarray);
}
结果:
[
[A, B, C, D, E],
[A, B, C, D, E],
[A, B, C, D, E],
[A, B, C, HELLO, E],
[A, B, C, D, E]
]
我认为这也成为您评论的答案。如果这对你有帮助,我很高兴。