2017-02-18 2 views
2

Neu bei Javascript und ich habe Probleme, die Anzahl der Wahrheiten in einem Array von booleschen Werten zu zählen. Ich versuche die Funktion reduce() zu verwenden. Kann mir jemand sagen, was ich falsch mache?Zählen Sie die Anzahl der wahren Mitglieder in einem Array von booleschen Werten

//trying to count the number of true in an array 
    myCount = [false,false,true,false,true].reduce(function(a,b){ 
     return b?a++:a; 
    },0); 
    alert("myCount ="+ myCount); // this is always 0 
+4

'[falsch, false, true, false, true] .filter (x => x) – Andreas

+0

.length' Das ist für mich gearbeitet Obwohl ich etwas daran ändern musste, war das was ich suchte. alert ($ scope.VendorAnalysisResults [0] .cols.filter (x => x.visible == true) .length) – Deathstalker

Antwort

6

Sie Rückkehr a++, wenn der Wert true ist, die immer Null. Post-Inkrement passiert nach der Wert abgerufen wird. Bei der ersten Iteration ist a 0 und der Wert a++ ist 0, obwohl a inkrementiert wird. Da a und b Parameter des Rückrufs sind, ist es ein neuer a bei jedem Anruf.

Statt:

myCount = [false,false,true,false,true].reduce(function(a,b){ 
    return b?a+1:a; 
},0); 
3

sollten Sie ++a verwenden, anstatt a++, weil Sie den Wert a plötzlich ändern müssen. a Variable wird inkrementiert, nachdem ihre value zurückgegeben wird.

myCount = [false,false,true,false,true].reduce(function(a,b){ 
 
     return b? ++a:a; 
 
    },0); 
 
alert("myCount ="+ myCount);

+1

Ja, das würde auch funktionieren. – Pointy

+0

. Natürlich. Danke das funktioniert perfekt – gitmole

0

ich nicht wirklich darüber bin sicher, aber a und b sind keine Zahlen.

Sie shoud wie etwas tun:

//trying to count the number of true in an array 
myCount = [false,false,true,false,true].reduce(function(a,b){ 
cpt = 0; 
if(a) cpt++; 
if(b) cpt++; 
return cpt; 
},0); 
alert("myCount ="+ myCount); // this is always 0 
+0

Das ist nicht wahr. 'a' und' b' sind Zahlen. –

+0

Ich habe etwas gelernt, danke! – Youri

+0

Tatsächlich ist "a" der akkumulierte Wert von vorherigen zurückgegebenen Werten und "b" ist der Wert des aktuellen Elements, das iteriert wird. Bei einem Array wie diesem ist der Wert ein boolescher Wert, der direkt für die Bedingung 'if' verwendet wird. Es wird zu einer Zahl ("0" oder "1") gezwungen, wenn damit gerechnet wird. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce –

6

Scheint, wie Ihr Problem bereits gelöst, aber es gibt viel einfache Methoden, es zu tun.

Array.prototype.filter() - meiner Meinung nach am einfachsten.

console.log([true,false,true,false,true].filter(v => v).length);

Array.prototype.forEach()

var myCounter = 0; 
 

 
[true,false,true,false,true].forEach(v => v ? myCounter++ : v); 
 

 
console.log(myCounter);

Verwandte Themen