如何复制数组的值(不指向)。切片对我不起作用

时间:2019-04-04 17:24:41

标签: javascript slice

我有一个函数试图将数组系统地添加到另一个多维数组。在正确计算要添加的数组的每个步骤中,但是,这些计算会更改先前输入的值。我试过使用slice但我显然做错了:(。

请参见下面的代码-受影响的返回值posMatrix

function allPossibilities(hand) {

    var startingHandLength = hand.length;
    var potHand = Array.prototype.slice.call(hand);
    var scores = new Array();
    var posMatrix = new Array();
    var nextCard = 1;
    var progressStage = true;
    var finished = false; 
    var shallowArr = new Array();  

    do {
         scores = calculateScores(potHand);
    var maxScore = Math.max.apply(null, scores)


    shallowArr = potHand.slice();

    if (maxScore>16.5)
        {posMatrix.push([shallowArr,maxScore])
         console.log(posMatrix);
         debugger;

            if (potHand.length !== startingHandLength)
                {
                    do{

                        if(potHand[potHand.length-1][1] < 10)
                             {
                                    potHand[potHand.length-1][1]++;
                                    progressStage = true;

                            }
                        else {potHand.pop();

                        potHand[potHand.length-1][1]++;}

                        } 
                        while(progressStage === false)

                }

        }
    else
        {

        potHand.push(["Imaginary",1,"Imaginary"]);

        }

    progressStage=false;

    if(potHand.length === startingHandLength)
        {finished = true;}


    }
    while(finished === false);


        return posMatrix;


}

如果起始手> 16.5,则该函数将正常运行,因为其他任何代码都不会运行。但是否则就没有。最终的返回值应该是一个数组,其中每个元素的外观如下:[[array],number]。这个数字看起来很好,但是由于它不是对象,因此不会受到影响。我希望[array]彼此不同,目前它们都相同。

2 个答案:

答案 0 :(得分:1)

Slice返回数组的浅副本,因为您具有多维数组,因此需要深度克隆数组

0.9.6

或者您可以使用loadash cloneDeep

答案 1 :(得分:0)

您制作了hand的浅表副本(顺便说一句,您应该包括在内)。用这样的语句

potHand[potHand.length-1][1]++;

您也正在访问和修改hand的元素。

在这里,potHand[potHand.length-1]是一个对象,它是hand的en元素(不是副本-相同元素)。