2017-03-22 4 views
0

erscheint So habe ich eine Würfel-Roll-Funktion. Ich möchte 2 Würfel 20 Mal rollen, jedes Mal, wenn ich rolle, möchte ich diese Zahlen hinzufügen, und dann möchte ich sehen, wie oft die Summe erscheint, und diese Zahl in ein Array setzen.Anzahl der Zeit, die eine Zahl in einem Array

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; 
 
}

so erhalten trackSum I, die 20 Zahlen in einer Anordnung aufweist, die jede Zahl die Summe der 2 Würfel gerollt wird. Wenn sum = 2 und es 5mal erscheint, sum = 4, 2 mal erscheint, sum = 3, erscheint 1 Mal, sollte final Array aussehen

[5, 2, 1] 

Bisher habe ich versucht, eine reduce Methode, filter und forEach. Ich kann einfach nicht herausfinden, wie man die Zahlen vergleicht, um zu sehen, wie oft es erscheint. Jede Hilfe wäre willkommen. Vielen Dank!

+0

Ist es Ihnen wichtig, die Reihenfolge der Rollen/Summen im Auge zu behalten? Oder möchten Sie nur wissen, wie oft jede Summe aufgetreten ist? – sethro

Antwort

3

Verwenden Sie ein Objekt, dessen Schlüssel die Summe und die Anzahl der Summen sind. Schleife durch trackSum und inkrementiere den Wert des entsprechenden Elements.

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

Ich würde 'freq [sum] ++' nicht in einem Ausdruck verwenden, der derselben Variablen zugewiesen ist. Es ist verwirrend. Vielleicht '(freq [Summe] || 0) + 1;' – trincot

+0

Ich wollte '+ 1', nicht' ++ 'schreiben, Finger zu schnell getippt. – Barmar

0

Entschuldigen meine eigene Frage zu beantworten, aber nach einigen googeln, dachte ich es aus. Achte also nicht auf die Reduzierungsmethode, die ich in meinem ursprünglichen Beitrag habe. Das ist, was ich tat statt:

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

Dies gibt ein Objekt, mit dem Summenwert als Schlüssel, und der Höhe der Zeit als Wert passiert.

Dann lernte ich eine neue Methode, die die Werte erfasst und in ein Array einfügt.

Object.values(countedSum) 

Das löst es!

Dank @Barmar für Ihre Hilfe!

Verwandte Themen