2017-03-22 22 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的帮助!

相关问题