【问题标题】:Pushing a new element onto and array changes another element将新元素推送到数组上会更改另一个元素
【发布时间】:2017-12-26 03:04:54
【问题描述】:

这是一个处理我遇到问题的数组的函数:

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 行1,值 2],[新值,第 0 行,第 1 行,第 0 行,第 2 行]]

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

我不想更改第一行。这就是问题所在。

【问题讨论】:

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


    【解决方案1】:

    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);

    【讨论】:

    • 谢谢哈萨! slice(0) 像冠军一样工作。我知道我的 HoldArray 是指向二维数组行的指针,但不知道如何创建未链接的副本。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2011-08-22
    • 2013-01-21
    • 2016-01-20
    • 2015-08-01
    相关资源
    最近更新 更多