Google Script - 无法写入单个2D数组元素

时间:2017-04-12 00:23:24

标签: javascript arrays multidimensional-array google-sheets

我正在使用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”]

请帮忙!非常感谢。

2 个答案:

答案 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)

在这种情况下,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会使用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]
]

我认为这也成为您评论的答案。如果这对你有帮助,我很高兴。