我可以重复n次对象数组中的值而不使用javascript中的循环吗?

时间:2017-05-07 01:54:07

标签: javascript arrays functional-programming

我正在参与函数式编程,我尽可能地避免循环,但是我在填充数组时遇到了一些问题。 我正在学习地图排序减少的基础知识,但我不能在以下代码中应用任何内容:

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

我想在不使用任何循环的情况下这样做,这可能吗?

2 个答案:

答案 0 :(得分:2)

  

我是否可以在javascript中使用循环n次重复对象数组中的值?

您是否只是在寻找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♧

答案 1 :(得分:1)

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, []);
}

在函数式编程中,循环等效于尾递归函数。