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

问题描述 投票:0回答:1

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

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维数组的行。

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

javascript multidimensional-array google-apps-script
1个回答
0
投票

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

您可以使用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);
© www.soinside.com 2019 - 2024. All rights reserved.