【问题标题】:How to fill an array using class instantiation如何使用类实例化填充数组
【发布时间】:2020-12-04 18:13:35
【问题描述】:

我正在学习 JavaScript。我在网上找到了这个问题并尝试这样做。

创建 2 个类“Card”和“Deck”,它们代表一副标准的 52 张扑克牌。例如黑桃 A 或红桃 5。

接受 2 个参数“suit”和“rank”并将它们存储为公共属性的卡片类。 Deck 类有一个常量数组 [S, C, D, H]。 Deck 有一个常数数组[2,3,4,5,6,7,8,9,10,J,Q,K,A]。 Deck 有一个空的“cards”数组

在 Deck 实例化时,使用“Card”类用所有 52 张标准扑克牌填充卡片数组

我只用Deck 类通过遍历数组来做到这一点。但是如何使用单独的类呢?

class Deck {
  suits = ["S", "C", "D", "H"];
  ranks = [2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A"];
  constructor(suits, ranks) {
    this.suits = suits;
    this.ranks = ranks;
    this.cards = [];
  }
  getAllCards() {
    var cards = new Array();

    for (var i = 0; i < suits.length; i++) {
      for (var x = 0; x < cards.length; x++) {
        var card = {
          Value: cards[x],
          Suit: suits[i]
        };
        cards.push(card);
      }
    }
  }
  return cards;
}

【问题讨论】:

  • 我在你的问题中没有看到 Deck 或 Card 类。
  • 我使用一个类/函数做到了这一点。它工作正常,给了我 52 张卡片。但是,我不明白如何在这里使用第二类。
  • 因此,不要使用您目前的 Deck 课程,让我来描述一下。 “采用 2 个参数“套装”和“等级”并将它们存储为公共属性的甲板类。

标签: javascript arrays


【解决方案1】:

您可以使用Card 类而不是对象来表示每张卡片。

class Card {
  constructor(suit, rank) {
    this.suit = suit;
    this.rank = rank;
  }
}
class Deck {
  static suits = ["S", "C", "D", "H"];
  static ranks = [2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A"];
  constructor() {
    this.cards = this.getAllCards();
  }
  getAllCards() {
    var cards = [];

    for (var i = 0; i < Deck.suits.length; i++) {
      for (var j = 0; j < Deck.ranks.length; j++) {
        var card = new Card(Deck.suits[i], Deck.ranks[j]);
        cards.push(card);
      }
    }
    return cards;
  }
}
console.log(new Deck().cards);

正如Scott Sauyet 所建议的那样,flatMapmap 操作也可以应用于更简洁的代码。

class Card {
  constructor(suit, rank) {
    this.suit = suit;
    this.rank = rank;
  }
}
class Deck {
  static suits = ["S", "C", "D", "H"];
  static ranks = [2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A"];
  constructor() {
    this.cards = Deck.suits.flatMap(suit => Deck.ranks.map(rank => new Card(suit, rank)));
  }
}
console.log(new Deck().cards);

【讨论】:

  • 完美,现在我明白了。感谢你的回答。我不明白 Card 类在这里有什么用。但是,我们仍然可以使用它。
  • @amar 没问题。 Card 类仅在此处使用,因为问题需要它。
  • 我明白了。它只是问题需要它。我是多么愚蠢,试图弄清楚我们为什么需要它以及如果它没有任何目的如何使用它。非常感谢。
  • 或者在构造函数中this.cards = Deck .ranks .flatMap (r =&gt; Deck .suits .map (s =&gt; new Card (s, r))),完全避免getAllCards
  • @ScottSauyet 谢谢你的好建议。
猜你喜欢
  • 1970-01-01
  • 2010-11-04
  • 2016-07-24
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2016-03-11
  • 1970-01-01
相关资源
最近更新 更多