在更改同一数组中的另一个对象时更改Javascript对象

时间:2016-02-10 15:15:21

标签: javascript arrays loops object

当我改变播放器[1] .pHand(pHand是一个包含对象的数组)时,看起来正在发生的是播放器[0] .pHand正在改变。

for(var j = 0; j < 2; j++){


        console.log(cardDeck[deckCounter]);

        player[0].pHand[j] = cardDeck[deckCounter];

        player[0].cardNumber ++;


        console.log(player[0].pHand[j]);

        deckCounter ++;         

    } 


    for(var k = 0; k < 2; k++){


        console.log(cardDeck[deckCounter]);

        player[1].pHand[k] = cardDeck[deckCounter];

        player[1].cardNumber ++;


        console.log(player[1].pHand[k]);
        console.log(player[0].pHand[k]);

        deckCounter ++;         

    } 

为了便于解释,我稍微更改了代码(我会有一个玩家索引的循环,而不是2个单独的循环),但每次都会出现相同的结果,其中给每个玩家的最后一组牌宾语。 在控制台中,日志通常是例如:

卡{西装:&#34;心&#34;,faceValue:&#34; 10&#34;,价值:10,播放:false,img:&#34; 10Heart.png&#34; ...} < / p>

卡{西装:&#34;心&#34;,faceValue:&#34; 10&#34;,价值:10,播放:false,img:&#34; 10Heart.png&#34; ...} < / p>

卡{西装:&#34;心&#34;,faceValue:&#34; 3&#34;,价值:3,播放:false,img:&#34; 3Heart.png&#34; ...} < / p>

卡{西装:&#34;心&#34;,faceValue:&#34; 3&#34;,价值:3,播放:false,img:&#34; 3Heart.png&#34; ...} < / p>

卡{西装:&#34; Spade&#34;,faceValue:&#34; J&#34;,价值:10,玩过:false,img:&#34; JSpade.png&#34; ...} < / p>

卡{西装:&#34; Spade&#34;,faceValue:&#34; J&#34;,价值:10,玩过:false,img:&#34; JSpade.png&#34; ...} < / p>

卡{西装:&#34; Spade&#34;,faceValue:&#34; J&#34;,价值:10,玩过:false,img:&#34; JSpade.png&#34; ...} < / p>

卡{西装:&#34; Spade&#34;,faceValue:&#34; K&#34;,价值:10,播放:false,img:&#34; KSpade.png&#34; ...} < / p>

卡{西装:&#34; Spade&#34;,faceValue:&#34; K&#34;,价值:10,播放:false,img:&#34; KSpade.png&#34; ...} < / p>

卡{西装:&#34; Spade&#34;,faceValue:&#34; K&#34;,价值:10,播放:false,img:&#34; KSpade.png&#34; ...} < / p>

非常感谢任何帮助或见解:)

1 个答案:

答案 0 :(得分:0)

Javascript通常在分配变量时使用引用,并将相同的cardDeck-Object分配给两个玩家的pH和属性。例如:

var pHand = {a:1,b:2};

var player = [];
player[0] = {};
player[1] = {};

player[0].pHand = pHand;
player[1].pHand = pHand; // we assign a REFERENCE here

console.log(player[0].pHand);
console.log(player[1].pHand);

console.log("changing value of b for player 0");
player[0].pHand.b = 3;

console.log(player[0].pHand);
console.log(player[1].pHand);
// both consolel logs above will be identical!

对于“如何克隆”js-object,您可以查看以下帖子: How do I correctly clone a JavaScript object?

只要您的对象是可序列化的(例如,不包含函数但只包含数组和对象),您可以使用它来创建一个简单的深层副本:

player[0].pHand = JSON.parse(JSON.stringify(pHand));

完整示例:https://jsfiddle.net/41f07f1a/