javascript - Google 脚本 - 无法写入单个二维数组元素

标签 javascript arrays multidimensional-array google-sheets

我正在 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)

在这种情况下,ar1ar2 都变为 [0.0, 0.0, 0.0, 1.0, 0.0]ar1ar2 均由 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)

在本例中,ar1ar2 分别是 [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/

相关文章:

arrays - Powershell 从出现 $N 次的 IP 数组创建逗号分隔列表

php - 比较两个不同的多维数组并突出显示变化

javascript - 将 div 放在所有内容之上,甚至在内置弹出窗口之上

javascript - 使用 JQuery/Javascript 滚动两个 Div

javascript - 使用 react-modal 更改模态的样式

java - 将数组中的元素移动到空位置

java - 使用 Iterator 迭代 2D 数组,就好像它是 1D 数组一样

javascript - 向图层添加矢量蒙版?

arrays - 如何在数组中的某个索引处插入新值并将所有内容向下移动一个索引?

javascript - 如何构建 javascript 字符串,以便 vbScript Split 将其拆分回数组中?