簡體   English   中英

更改 object 的選定部分的順序

[英]Changing the order of a selected part of the object

我正在為作業寫一個 class Deck class 采用一組代碼,每個代碼代表一張牌,如 3D(方塊 3)、5S(黑桃 5)、As(黑桃 A),如果表示牌類型的最后一個字母為小寫,則意思是卡翻了。 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)接受一個可選的數組或數字並將這些卡片翻過來。 如果沒有給出參數,它會翻轉每張牌,如果給出一個空數組,它什么也不改變。

function 我正在嘗試編寫, turnTop(num)需要一個整數,從牌堆中抽取那么多張牌,然后將每張牌以相反的順序翻過來。 所以:

>>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);
    }
}

對卡片數組使用slice方法從數組中獲取一個“切片”,並使用reverse方法反轉順序。 然后將卡的 rest 與另一個切片一起獲取,並將兩個切片重新連接在一起。

要檢查大寫或小寫檢查,請使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM