计算数字在数组中显示的时间量

时间:2017-03-22 21:06:16

标签: javascript arrays object

所以我有一个骰子滚动功能。我想要滚动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。我只是无法弄清楚如何比较数字,看看它出现了多少次。任何帮助,将不胜感激。谢谢!

2 个答案:

答案 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的帮助!