在一个布尔类型的数组中统计真值成员的数量

43

我刚开始学习 JavaScript,遇到了一个问题,就是如何统计布尔值数组中 true 的数量。我试着使用 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

7
[false,false,true,false,true].filter(x => x).length - Andreas
这对我有用,尽管我不得不对它进行一些修改,但这正是我要找的。 警告($scope.VendorAnalysisResults [0] .cols.filter(x => x.visible == true).length) - Deathstalker
5个回答

109

看起来你的问题已经得到解决了,但有许多更简单的方法可以解决它。

绝佳之选:

.filter(Boolean); // will keep every truthy value in an array

const arr = [true, false, true, false, true];
const count = arr.filter(Boolean).length;

console.log(count);

好的例子:

const arr = [true, false, true, false, true];
const count = arr.filter((value) => value).length;

console.log(count);

平均替代方案:

let myCounter = 0;

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

console.log(myCounter);


1
很棒的解决方案 console.log([true,false,true,false,true].filter(Boolean).length); 但是出于好奇,它是如何工作的呢?毕竟false也是一个布尔值吧? - Jon
@Jon 是的,false当然是一个布尔值,但它并不像typeof value === 'boolean'那样工作,它仅对真值返回true,而非每个布尔值都返回true。让Array#filter来完成其余任务吧。 - kind user

10

当值为true时,你返回了a++,这将永远是零。后自增发生在取回值之后。因此,在第一次迭代中,a为0,a++的值也是0,即使a已经增加。因为ab是回调函数的参数,每次调用时都会有一个新的a

改为:

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

console.log(myCount);


8

有多种方法可以实现。

  1. Boolean with filter()

     const arrayCount = [false,false,true,false,true].filter(Boolean).length;
     console.log(arrayCount);
    
  2. filter

     const arrayCount = [false,false,true,false,true].filter(item => item).length;
     console.log(arrayCount);
    
  3. reduce()

    const arrayCount = [false,false,true,false,true].reduce((acc, current) => acc + current, 0);
    console.log(arrayCount);
    
  4. Using function

    function arrayCount(arr) {
     let result = [];
     for(let i = 0; i < arr.length; i++) {
         if (arr[i] === true) {
             result.push(arr[i]);
         }
     }
     return result.length;
    }
    
    console.log(arrayCount([false,false,true,false,true]))
    
  5. Using for..of

      function arrayCount(arr) {
          let count = 0;
          for(let element of arr) if(element===true) count++;
          return count;
     }
    
    console.log(arrayCount([false,false,true,false,true]))
    

5

在IT技术中,建议使用++a而不是a++,因为你需要突然改变a的值。a变量的值将在其value被返回后递增。

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


-2

我不太确定,但是ab不是数字。

你应该做一些像这样的事情:

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

那不是真的。ab是数字。 - Mihai Alexandru-Ionut
实际上,a 是先前返回值的累积值,而 b 是当前正在迭代的元素的值。对于这样的数组,该值是一个布尔值,直接用于 if 条件。如果进行数学运算,它将被强制转换为数字(01)。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce - Scott Marcus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接