web-dev-qa-db-ja.com

ブール値の配列内の真のメンバーの数を数える

Javascriptが初めてで、ブール値の配列の真の数を数えるのに問題があります。 reduce()関数を使用しようとしています。誰かが私が間違っていることを教えてもらえますか?

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

あなたの問題はすでに解決されているようですが、それを行う簡単な方法がたくさんあります。

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

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

またはさらに単純な:

console.log([true,false,true,false,true].filter(Boolean).length);

Array.prototype.forEach()

var myCounter = 0;

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

console.log(myCounter);
39
kind user

値がtrueの場合、a++を返します。これは常にゼロになります。ポストインクリメントが発生しますafter値が取得されます。そのため、最初の反復では、aは0であり、a++の値はalso0です。ただし、aはインクリメントされます。 abはコールバックのパラメーターであるため、呼び出しごとに新しいaになります。

代わりに:

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

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

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