2017-03-22 23 views
0

所以我有一個骰子滾動功能。我想滾動2次骰子20次,每次滾動時,我想添加這些數字,然後我想看看總和出現的次數,並將該數字放入數組中。一個數字出現在一個數組中的時間計數

function Dice() { 
 
    this.roll = function() { 
 
    var randomValue = Math.ceil(Math.random() * 6); 
 
    this.side = randomValue; 
 
    return this.side; 
 
    } 
 
} 
 

 
var dice1 = new Dice(); 
 
var dice2 = new Dice(); 
 

 
function getAmount() { 
 
    var finalArray = []; 
 

 
    function diceSum() { 
 
    var sum = dice1.roll() + dice2.roll(); 
 
    return sum; 
 
    } 
 

 
    var trackSum = []; 
 
    for (var i = 1; i <= 20; i++) { 
 
    trackSum.push(diceSum()); 
 
    } 
 

 

 
    var reduced = trackSum.reduce(function(acc, sum, i, arr) { 
 
    return acc.i += sum; 
 
    }, {}); 
 
    return reduced; 
 
}

所以我得到trackSum其具有20個號碼中的陣列,每個數字是2骰子的擲骰總和。如果sum = 2並出現5次,sum = 4,出現2次,sum = 3,出現1次,最終陣列應該像

[5, 2, 1] 

到目前爲止,我嘗試了reduce方法,filterforEach。我只是無法弄清楚如何比較數字,看看它出現的次數。任何幫助,將不勝感激。謝謝!

+0

你是否在意追蹤卷/次數的順序?或者你只是想知道每次發生的次數? – sethro

回答

3

使用一個對象,其鍵是總和,值是總和出現的次數。遍歷trackSum並遞增相應元素的值。

var freq = {}; 
trackSum.forEach(function(sum) { 
    freq[sum] = freq[sum] ? freq[sum] + 1 : 1; 
} 
console.log(freq); 
+1

我不會在分配給相同變量的表達式中使用'freq ++'。這很混亂。也許'(freq≡|| 0)+ 1;' – trincot

+0

我打算寫'+ 1',而不是'++',手指輸入得太快。 – Barmar

0

對於回答我自己的問題表示抱歉,但是經過一些Google搜索後,我明白了。所以不要留意我原來發布的減法方法。這是我做過什麼,而不是:

var countedSum = trackSum.reduce(function(emptyObj, sum, i, arr){ 
     if (sum in emptyObj){ 
     emptyObj[sum]++ 
     } else { 
     emptyObj[sum] = 1 
     } 
     return emptyObj; 
    }, {}); 

這返回一個對象,與和值作爲重點,與時代正好是價值的款額。

然後我學到了一種新方法,它抓取值並將其放入數組中。

Object.values(countedSum) 

解決了!

感謝@Barmar的幫助!

相關問題