簡體   English   中英

我可以在對象數組中重復n次而不使用javascript中的循環嗎?

[英]Can I repeat the values in an array of objects n times without using loop in javascript?

我被函數式編程所吸引,並且我正在盡可能地避免循環,但是在填充數組時遇到了一些問題。 我正在學習mapsortreduce的基礎知識,但是我不能在以下代碼中應用任何這些方法:

function generateDecks(amount){
    //the set of cards
    var cards = [
    {suit:"spades",value:"2"},
    {suit:"spades",value:"3"},
    {suit:"spades",value:"4"},
    {suit:"spades",value:"5"},
    {suit:"spades",value:"6"},
    {suit:"spades",value:"7"},
    {suit:"spades",value:"8"},
    {suit:"spades",value:"9"},
    {suit:"spades",value:"10"},
    {suit:"spades",value:"jack"},
    {suit:"spades",value:"queen"},
    {suit:"spades",value:"king"},
    {suit:"spades",value:"ace"},
    {suit:"hearts",value:"2"},
    {suit:"hearts",value:"3"},
    {suit:"hearts",value:"4"},
    {suit:"hearts",value:"5"},
    {suit:"hearts",value:"6"},
    {suit:"hearts",value:"7"},
    {suit:"hearts",value:"8"},
    {suit:"hearts",value:"9"},
    {suit:"hearts",value:"10"},
    {suit:"hearts",value:"jack"},
    {suit:"hearts",value:"queen"},
    {suit:"hearts",value:"king"},
    {suit:"hearts",value:"ace"},
    {suit:"clouds",value:"2"},
    {suit:"clubs",value:"3"},
    {suit:"clubs",value:"4"},
    {suit:"clubs",value:"5"},
    {suit:"clubs",value:"6"},
    {suit:"clubs",value:"7"},
    {suit:"clubs",value:"8"},
    {suit:"clubs",value:"9"},
    {suit:"clubs",value:"10"},
    {suit:"clubs",value:"jack"},
    {suit:"clubs",value:"queen"},
    {suit:"clubs",value:"king"},
    {suit:"clubs",value:"ace"},
    {suit:"diamonds",value:"2"},
    {suit:"diamonds",value:"3"},
    {suit:"diamonds",value:"4"},
    {suit:"diamonds",value:"5"},
    {suit:"diamonds",value:"6"},
    {suit:"diamonds",value:"7"},
    {suit:"diamonds",value:"8"},
    {suit:"diamonds",value:"9"},
    {suit:"diamonds",value:"10"},
    {suit:"diamonds",value:"jack"},
    {suit:"diamonds",value:"queen"},
    {suit:"diamonds",value:"king"},
    {suit:"diamonds",value:"ace"}
    ];
    var deck = [];

    //here it's the loop
    for (var i = 0; i < amount; i++){
        deck = deck.concat(cards);
    }
}

我想這樣做而不使用任何循環,這可能嗎?

我可以在對象數組中重復n次而不使用javascript中的循環嗎?

您只是在尋找Array.fill嗎?

 let x = Array(5).fill('a') console.log(x) // [ 'a', 'a', 'a', 'a', 'a' ] 

您也可以使用Array.from

 let K = x => y => x let x = Array.from(Array(5), K('a')) console.log(x) // [ 'a', 'a', 'a', 'a', 'a' ] 


盡管有人會說,JavaScript對於函數式編程還是很棒的

 const rand = x => Math.floor(Math.random() * x) const suits = ['♤', '♡', '♧', '♢'] const ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] const Card = id => ({ id, suit: suits[id % suits.length], rank: ranks[id % ranks.length], }) const Deck = (suits, ranks) => Array.from(Array(suits.length * ranks.length), (_,id) => Card(id)) Deck.deal = n => d => [d.slice(0,n), d.slice(n)] Deck.print = d => console.log(d.map(({rank, suit}) => `${rank}${suit}`).join(',')) // create a new deck, d const d = Deck(suits, ranks) // deal a new hand of 5 cards, get a new deck back with the 5 cards removed let [newHand, newDeck] = Deck.deal(5) (d) Deck.print(newHand) // A♤,2♡,3♧,4♢,5♤ Deck.print(newDeck) // 6♡,7♧,8♢,9♤,10♡,J♧,Q♢,K♤,A♡,2♧,3♢,4♤,5♡,6♧,7♢,8♤,9♡,10♧,J♢,Q♤,K♡,A♧,2♢,3♤,4♡,5♧,6♢,7♤,8♡,9♧,10♢,J♤,Q♡,K♧,A♢,2♤,3♡,4♧,5♢,6♤,7♡,8♧,9♢,10♤,J♡,Q♧,K♢ 


添加一個很酷的改組功能

Deck.shuffle = d => {
  let acc = []
  for (let i = 0, j; j = rand(i), i < d.length; acc[j] = d[i], i++)
    if (j !== i)
      acc[i] = acc[j]
  return acc
}

// make a new Deck and shuffle it
const d = Deck.shuffle(Deck(suits, ranks))

// same demo as last time
let [newHand, newDeck] = Deck.deal(5) (d)

Deck.print(newHand) // 8♡,9♡,3♤,9♧,K♢
Deck.print(newDeck) // 9♤,10♤,A♡,K♡,J♢,8♧,J♧,7♤,9♢,6♡,4♤,5♡,7♢,2♤,2♧,6♢,2♢,2♡,3♢,10♢,5♤,Q♡,J♡,6♤,5♢,K♤,3♡,10♧,4♧,Q♧,7♡,10♡,A♢,8♢,8♤,4♢,J♤,K♧,Q♢,Q♤,A♧,6♧,3♧,4♡,A♤,5♧,7♧

JavaScript並不是函數式編程的好語言,但是您可以通過以下方式模仿它:

function generateDecks(amount){
    const template_cards = /* your cards */;

    function repeat(n, cards){
        if(n < 1)    return cards;
        else         return repeat(n - 1, template_cards.concat(cards));
    }

    return repeat(amount, []);
}

在函數式編程中,循環等效於尾部遞歸函數。

暫無
暫無

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

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