2017-02-18 1 views
2

Nouveauté de javascript et j'ai des difficultés à compter le nombre de trues dans un tableau de valeurs booléennes. J'essaie d'utiliser la fonction reduce(). Quelqu'un peut-il me dire ce que je fais mal?Compter le nombre de membres réels dans un tableau de valeurs booléennes

//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

'[faux, faux, vrai, faux, vrai] .filter (x => x) .length' – Andreas

+0

Cela a fonctionné pour moi Bien que j'ai dû faire une petite modification, c'était ce que je cherchais. alerte ($ scope.VendorAnalysisResults [0] .cols.filter (x => x.visible == true) .length) – Deathstalker

Répondre

6

Vous retournerez a++ lorsque la valeur est true, qui sera toujours nul. Post-incrément passe après la valeur est récupérée. Donc, à la première itération, a est 0, et la valeur de a++ est 0, même si a est incrémenté. Parce que a et b sont les paramètres du rappel, c'est a frais sur chaque appel.

Au lieu de cela:

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

Vous devez utiliser ++a à la place a++ parce que vous devez changer soudainement la valeur de a. La variable a sera incrémentée après que son value a été renvoyé.

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

+1

Oui, cela fonctionnerait aussi. – Pointy

+0

. Bien sûr. Merci cela fonctionne parfaitement – gitmole

0

Je ne suis pas vraiment sûr, mais a et b ne sont pas des numéros.

Vous faites quelque chose comme qui devraient:

//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

Ce n'est pas vrai. 'a' et' b' sont des nombres. –

+0

J'ai appris quelque chose, merci! – Youri

+0

En fait, 'a' est la valeur cumulée des valeurs retournées précédentes et' b' est la valeur de l'élément courant en cours d'itération. Avec un tableau comme celui-ci, la valeur est un booléen, qui est utilisé directement pour la condition 'if'. Il sera contraint en un nombre ('0' ou' 1') si les mathématiques sont faites avec. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce –

6

On dirait que votre problème est déjà résolu, mais il y a beaucoup de méthodes plus faciles à le faire.

Array.prototype.filter() - le plus facile, à mon avis.

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