将新元素推送到和数组会更改另一个元素

时间:2017-12-26 03:04:54

标签: javascript multidimensional-array google-apps-script

这是一个操作我遇到问题的数组的函数:

function playWithArrays2()
{

    var OneDimArray = [];
    var TwoDimArray = [];
    OneDimArray.push('Row 0,Value 0');
    OneDimArray.push('Row 0,Value 1');
    OneDimArray.push('Row 0,Value 2');
    TwoDimArray.push(OneDimArray);

    OneDimArray = [];
    OneDimArray.push('Row 1,Value 0');
    OneDimArray.push('Row 1,Value 1');
    OneDimArray.push('Row 1,Value 2');
    TwoDimArray.push(OneDimArray); 

    var HoldArray = TwoDimArray[0];
    HoldArray[0] = "New Value";

    TwoDimArray.push(HoldArray);

    Logger.log(TwoDimArray);

}

我试图将一行二维数组复制到单行数组,修改单行数组中的一列,然后将其推送到二维数组。这是日志的输出:

  

[17-12-25 21:55:16:660 EST] [[新值,行0,值1,行0,值2],[行1,值0,行1,值1,行1,值2],[新值,行0,值1,行0,值2]]

正如您所见,推送工作正常:创建第3个更改的行。问题是第一行也被改变了。这是分配给1维数组的行。

我不想改变第一排。这就是问题所在。

1 个答案:

答案 0 :(得分:0)

javascript中的数组也是对象,变量保存对象的引用,而不是对象本身。在您的情况var HoldArray = TwoDimArray[0];中,HoldArray引用了TwoDimArray的0行,您正在修改此引用中的值,这就是为什么它会影响这两个位置的值两个值都有相同的参考。

您可以使用array#slice

创建数组的副本
var HoldArray = TwoDimArray[0].slice(0);

var OneDimArray = [];
var TwoDimArray = [];
OneDimArray.push('Row 0,Value 0');
OneDimArray.push('Row 0,Value 1');
OneDimArray.push('Row 0,Value 2');
TwoDimArray.push(OneDimArray);

OneDimArray = [];
OneDimArray.push('Row 1,Value 0');
OneDimArray.push('Row 1,Value 1');
OneDimArray.push('Row 1,Value 2');
TwoDimArray.push(OneDimArray); 

var HoldArray = TwoDimArray[0].slice(0);
HoldArray[0] = "New Value";

TwoDimArray.push(HoldArray);
console.log(TwoDimArray);