【问题标题】:Javascript push element in one array push into anotherJavascript将一个数组中的元素推入另一个数组
【发布时间】:2021-01-18 17:36:27
【问题描述】:

我正在使用 Typescript 制作纸牌游戏,但我在抽牌时遇到问题。每个玩家必须始终拥有 8 张牌,并在抽牌时将牌从牌库中取出。

type PlayerObject = {
    cards: Card[];
    ...
};

class Game {
    players: PlayerObject[];
    red: Card[];
    NULL_PLAYER = {
       ...
       cards: [],
       ...
    };

    ...

    addPlayer(socket, name, id) {
        this.players.push({...Game.NULL_PLAYER, name, socket, id });
    }

    ...

    start() {
        for (const player of this.players) {
            this.giveCards(player);
        }
    }

    // When the game starts
    giveCards(player: PlayerObject) {
        const n = 8 - player.cards.length;
        for (let i = 0; i < 8 - cardsN; i++) {
            const cardIndex = Math.floor(Math.random() * this.red.length);
            player.cards.push(this.red.splice(cardIndex, 1)[0]); // I'll reference this line
        }
    }
}

player.cards.push(...)被执行时,它会推送给每个玩家。所以当其他玩家平局时,n 始终为 0 并跳过它。

结果:每个玩家都拥有相同的手牌。 预期结果:每个玩家都有不同的手牌。

【问题讨论】:

  • 请明确说明您的问题是什么。 IE;预期的行为是什么,而不仅仅是你得到的行为。

标签: arrays typescript


【解决方案1】:

我找到了一篇描述该问题的中型文章:https://medium.com/@naveenkarippai/learning-how-references-work-in-javascript-a066a4e15600

在示例中,我在将玩家添加到列表时使用了 Game.NULL_PLAYER 对象中的卡片引用。并且如文章所述,数组不像原始值那样在分配给新变量时会复制。如下图:

var flash = [8,8,8];
var quicksilver = flash;   //assign-by-reference
quicksilver.push(0);
console.log(flash);        //[8,8,8,0]
console.log(quicksilver);  //[8,8,8,0]

所以每个玩家对卡片数组都有相同的引用,当为一个玩家推送一张新卡片时,它会为每个人添加一张。解决方法是将cards 属性重新分配给一个空数组。

【讨论】:

    猜你喜欢
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多