我正在 Google 脚本中使用二维数组。我遇到了一个我无法解决的问题。当我尝试更改二维数组中的单个数组元素时,其他值也会更改...有人可以告诉我我做错了什么吗?
这是一个高度简化的示例:
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]个元素都会更改。输出为:
[“A”,“B”,“C”,“你好”,“E”]
[“A”,“B”,“C”,“你好”,“E”]
[“A”,“B”,“C”,“你好”,“E”]
[“A”,“B”,“C”,“你好”,“E”]
[“A”,“B”,“C”,“你好”,“E”]
为什么它会向元素 [0][3]、[1][3]、[2][3]、[3][3] 和 [4][3] 写入“HELLO”??
我试图得到这个但不能:
[“A”、“B”、“C”、“D”、“E”]
[“A”、“B”、“C”、“D”、“E”]
[“A”、“B”、“C”、“D”、“E”]
[“A”,“B”,“C”,“你好”,“E”]
[“A”、“B”、“C”、“D”、“E”]
请帮忙!非常感谢。
最佳答案
这是按引用调用和按值调用之间的区别。在通过引用调用时,它想象它共享变量。在按值调用时,它会复制变量。在javascript中,对象数据类型(数组、切片、关联数组等)和原始数据类型(数字、字符串、 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
会使用 push()
导入到 bigarray
。这就是引用调用。因此,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]
]
我认为这也成为对您评论的回答。如果这对您有帮助,我很高兴。
关于javascript - Google 脚本 - 无法写入单个二维数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43358265/