Изменение порядка выделенной части объекта - PullRequest
2 голосов
/ 05 мая 2020

Пишу класс Deck по заданию. Класс, который принимает массив кодов, каждый из которых представляет карту, такую ​​как 3D (3 бубен), 5S (5 пик), As (пик пик), и если последняя буква, представляющая тип карты, находится в нижнем регистре, то она означает, что карта перевернута. toString() возвращает строку данной колоды, если карты обращены вверх, она добавляется к строке, но если карта перевернута, она добавляет ** к строке так:

>>const deck1 = new Deck(["ah", "3S", "KC", "4H", "3D", "10H", "8D", "5D", "7C", "QS"]);
>>deck1.toString();
"** 3S KC 4H 3D 10H 8D 5D 7C QS"

turn(arr) принимает необязательный массив или число и переворачивает эти карточки. Если аргумент не указан, он переворачивает каждую карту, если задан пустой массив, он ничего не меняет.

Функция, которую я пытаюсь написать, turnTop(num) принимает int dr aws столько карт из колоды и кладет каждую перевернутую карту в обратном порядке. Итак:

>>const deck1 = new Deck(["ah", "3S", "KC", "4H", "3D", "10H", "8D", "5D", "7C", "QS"]);
>>deck1.turnTop(3);
"** ** AH 4H 3D 10H 8D 5D 7C QS" // "ah" was first, now AH is the third card

Я могу перевернуть карты, но не смог найти способ изменить порядок затронутых карт.

class Deck{
     constructor(deck) {
    this.deck = deck;
    const digit = /\d/;
    const type = /[2-9AKQJakqj]/; // Ace, King, Queen, Joker
    const color = /[CDHScdhs]/;
    for (let card of deck) {
        if (digit.test(card.charAt(card.length - 1))) {
            throw "AssertionError: invalid card";
        } else if (!type.test(card.charAt(0))) {
            if (card.charAt(1) !== "0") { // as not to throw an error if the card is  is 10
                throw "AssertionError: invalid card";
            }
        } else if (!color.test(card.charAt(card.length - 1))) {
            throw "AssertionError: invalid card";
        }
    }
}
    toString(){
        let str = "";
        for (let card of this.deck){
            if (card.charAt(card.length-1) === card.charAt(card.length-1).toUpperCase()){
                str += " " + card;
            }
            else if(card.charAt(card.length-1) === card.charAt(card.length-1).toLowerCase()){
                str += " " + "**"
            }
        }
        str = str.substring(1);
        return str;
    }
    turn(arr){
        if (arr === undefined ){
            for (let i in this.deck){
                if(this.deck[i].charAt(this.deck[i].length-1) === this.deck[i].charAt(this.deck[i].length-1).toUpperCase() ){
                    this.deck[i] = this.deck[i].toLowerCase();
                }else{
                    this.deck[i] = this.deck[i].toUpperCase();
                }
            }
        }else if (arr.length > 1){
            for (let card of arr){
                if (this.deck[card - 1] === this.deck[card - 1].toUpperCase()){
                    this.deck[card - 1] =  this.deck[card - 1].toLowerCase();
                }else{
                    this.deck[card - 1] =  this.deck[card - 1].toUpperCase();
                }
            }
        }else if(arr.length === 0){
            return new Deck(this.deck);
        }
        else{
            if (this.deck[arr-1] === this.deck[arr-1].toUpperCase()){
                this.deck[arr-1] = this.deck[arr-1].toLowerCase();
            }else{
                this.deck[arr-1] = this.deck[arr-1].toUpperCase();
            }
        }
        return new Deck(this.deck);
    }

    turnTop(num){
        for (let i =1;i<=num;i++){
            if ((this.deck[i-1] === this.deck[i-1].toUpperCase())){
                this.deck[i-1] = this.deck[i-1].toLowerCase();
            }else{
                this.deck[i-1] = this.deck[i-1].toUpperCase();
            }
        }return new Deck(this.deck);
    }
}

1 Ответ

2 голосов
/ 05 мая 2020

Используйте метод slice для массива карточек, чтобы получить «фрагмент» из массива, и используйте метод reverse, чтобы изменить порядок на обратное. Затем возьмите остальные карточки с другим фрагментом и объедините оба фрагмента обратно вместе.

И для проверки верхнего или нижнего регистра используйте map, чтобы создать новый массив с заглавные или строчные буквы.

const cards = ["AH", "3S", "KC", "4H", "3D", "10H", "8D", "5D", "7C", "QS"];

class Deck {

  constructor(cards) {
    this.deck = cards;
  }

  turnTop(amount) {
    let cardSelection = this.deck.slice(0, amount).reverse().map(card => {
      if (card.toLowerCase() === card) {
        return card.toUpperCase();
      } else {
        return card.toLowerCase();
      }
    });
    let restOfCards = this.deck.slice(amount, this.deck.length);
    this.deck = [...cardSelection, ...restOfCards];
    return this;
  }
  
}

const deckOfCards = new Deck(cards);
deckOfCards.turnTop(3);

console.log(deckOfCards.deck);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...