所以我有一个骰子滚动功能。我想要滚动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
方法,filter
和forEach
。我只是无法弄清楚如何比较数字,看看它出现了多少次。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:3)
使用键为和的对象,值为总和出现的次数。循环遍历trackSum
并增加相应元素的值。
var freq = {};
trackSum.forEach(function(sum) {
freq[sum] = freq[sum] ? freq[sum] + 1 : 1;
}
console.log(freq);
答案 1 :(得分:0)
为回答我自己的问题道歉,但经过一些谷歌搜索后,我明白了。所以不要注意我在原帖中的reduce方法。这就是我所做的:
var countedSum = trackSum.reduce(function(emptyObj, sum, i, arr){
if (sum in emptyObj){
emptyObj[sum]++
} else {
emptyObj[sum] = 1
}
return emptyObj;
}, {});
这将返回一个对象,其中sum值为键,以及它作为值发生的次数。
然后我学会了一种抓取值并将其放入数组的新方法。
Object.values(countedSum)
解决了它!
感谢@Barmar的帮助!