2016-08-02 25 views
2

所以我这里有一些代码: 首先简单随机#发电机和阵列选择功能:如何在JavaScript中定义多个阵列

function Rand(min, max) { 
    return parseFloat(Math.floor(Math.random() * max - min + 1))) + parseFloat(min); 
} 

function Choose(arr) { 
    //Returns an element from an array at random. 
    return arr[Math.floor(Math.random() * arr.length)]; 
} 

和第二卡片洗牌:

function CardDeck() { 
    var Cd = ["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"]; 
    var H = []; 
    var S = []; 
    var D = []; 
    var C = []; 
    var Result = []; 
    var Dk = document.getElementById("Deck Count").value; 

    for (i = 0; i < Cd.length; i++) { 
    S[i] = Cd[i] + " of Spades"; 
    H[i] = Cd[i] + " of Hearts"; 
    C[i] = Cd[i] + " of Clubs"; 
    D[i] = Cd[i] + " of Diamonds"; 
    } 

    if (Dk == "4") { 
    P = S.concat(C, D, H); 
    } else if (Dk == "5") { 
    var St = []; 
    for (i = 0; i < Cd.length; i++) { 
     St[i] = Cd[i] + " of Stars"; 
    } 
    P = S.concat(C, D, H, St); 
    } else if (Dk == "6") { 
    var Rk = []; 
    var Wh = []; 
    for (i = 0; i < Cd.length; i++) { 
     Rk[i] = Cd[i] + " of Rackets"; 
     Wh[i] = Cd[i] + " of Wheels"; 
    } 
    P = S.concat(C, D, H, Rk, Wh); 
    } 

    for (i = 0; i < Dk * Cd.length; i++) { 
    var Q = Choose(P); 
    R = P.indexOf(Q); 
    Result[i] = (i + 1) + ": " + Q; 
    P = P.slice(0, R).concat(P.slice(R + 1)); 
    } 

    document.getElementById("Cards").innerHTML = Result.join("\n"); 
} 

有没有一种简单的方法可以让这个过程更快,或者至少可以更快地声明数组,而不是仅仅为每个数组执行a = [],b = [] ...,因为这可能很费时费力。

此外,有没有办法让在基地JS较长时间的更好的RNG(无库,因为这是建立在基础JS)

+1

它不一定更快,但将这些数组用作属性或使用数组数组可能会更方便。 –

回答

0

如果存放在另一个数组它消除了很多变数西服名称;然后使用applyconcat可以让他们全部纳入Result在一个镜头:

function CardDeck() { 
    var Cd = ["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"]; 
    var Result = []; 
    var Dk = document.getElementById("Deck Count").value; 

    // Put the suit names into a new array 
    var suitNames = [" of Spades", " of Hearts", " of Clubs", " of Diamonds"]; 
    if (Dk == "5") { 
    suitNames.push(" of Stars"); 
    } else if (Dk == "6") { 
    suitNames.push(" of Rackets"); 
    suitNames.push(" of Wheels"); 
    } 

    // Create all suit stacks as an array of arrays 
    var suits = []; 
    for (var i = 0; i < Cd.length; i++) { 
    for(var j = 0; j < suitNames.length; j++) { 
     if(i===0) suits.push([]); 
     suits[j].push(Cd[i] + suitNames[j]); 
    } 
    } 

    // Combine all cards into a single array 
    var P = Array.prototype.concat.apply([], suits); 

    // Shuffle the deck 
    for (i = 0; i < P.length; i++) { 
    var Q = Choose(P); 
    R = P.indexOf(Q); 
    Result[i] = (i + 1) + ": " + Q; 
    P = P.slice(0, R).concat(P.slice(R + 1)); 
    } 

    document.getElementById("Cards").innerHTML = Result.join("\n"); 

} 

下面是一个运行示例: https://jsfiddle.net/b4rf3ne2/

那是更接近你在找什么?

+1

是的,这是完美的,因为它也允许立即制作很多西装!谢谢。 –

1

你能避免这样一遍又一遍打字varvar H=[], S=[], D=[], C=[];但除此之外,你很难得到比你所拥有的简洁。

0

你可以这样做:声明一个数组的根,然后声明了很多子阵列的for循环:

var arrays = []; 
var nmbOfAr = 20; 
for(int i = 0; i < nmbOfAr; i++){ 
    arrays[i] = []; 
} 
0

使用ES6我认为我们可以做出微小的改进。

let {S, H, C, D} = Cd.reduce((state, cardType, idx) => { 
    state.S.push(cardType + ' of Spades'); 
    state.H.push(cardType + ' of Hearts'); 
    state.C.push(cardType + ' of Clubs'); 
    state.C.push(cardType + ' of Diamonds'); 
    return state; 
}, { 
    S: [], 
    H: [], 
    C: [], 
    D: [], 
});