2017-02-18 6 views
2

JavaScriptの新機能で、ブール値の配列で真理数を数えるのに問題があります。私は、reduce()関数を使用しようとしています。誰かが私が間違っていることを教えてもらえますか?値は常にゼロになりますtrue、あるときブール値の配列内の真のメンバーの数を数えます。

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

'[偽、偽、真、偽、真] .filter(X => x)の – Andreas

+0

.length'これは私のために働きましたそれを少し修正しなければならなかったが、これは私が探していたものだった。 alert($ scope.VendorAnalysisResults [0] .cols.filter(x => x.visible == true).length) – Deathstalker

答えて

6

あなたはa++を返します。ポストインクリメントは、の後にとなり、値が取得されます。したがって、aが増分されても、最初の反復ではaは0であり、a++の値はでもです。 abはコールバックのパラメータであるため、呼び出しごとにフレッシュなaです。代わりに

:あなたは突然aの値を変更する必要があるため

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

あなたは++a代わりにa++を使用する必要があります。 valueが返された後にa変数がインクリメントされます。

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

+1

はいこれも機能します。もちろん。 – Pointy

+0

。もちろん。ありがとう、これは完全に動作します – gitmole

0

私はこれについては本当にわからないですが、abは数字ではありません。

あなたが好きな何かをshoud:あなたの問題はすでに解決されたよう

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

それは本当ではありません。 'a'と' b'は数字です。 –

+0

私は何かを学んだ、ありがとう! – Youri

+0

実際には、 'a'は前回返された値からの累積値であり、' b'は反復されている現在の要素の値です。このような配列では、値はブール値で、 'if'条件のために直接使用されます。数学がそれで済むなら、それは数( "0"または "1")に強制されます。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce –

6

は見えますが、それを行うにはより簡単な方法がたくさんあります。

Array.prototype.filter() - 私の意見では、最も簡単なものです。

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

関連する問題