【问题标题】:Count the number of true members in an array of boolean values计算布尔值数组中真实成员的数量
【发布时间】:2023-04-02 09:05:02
【问题描述】:

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

【问题讨论】:

  • [false,false,true,false,true].filter(x => x).length
  • 这对我有用,尽管必须对其进行一些修改,这正是我想要的。 alert($scope.VendorAnalysisResults[0].cols.filter(x => x.visible == true).length)

标签: javascript arrays ternary-operator reduce


【解决方案1】:

您的问题似乎已经解决了,但有很多更简单的方法可以解决。

优秀的:

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

【讨论】:

  • 很好的解决方案 console.log([true,false,true,false,true].filter(Boolean).length);但只是出于好奇,它是如何工作的?肯定 false 也是布尔值吗?
  • @Jon 是的,false 当然是一个布尔值,但是它不像typeof value === 'boolean' 那样工作,它会为每个布尔值始终返回 true,但它只会为真实值返回 true。然后让Array#filter 完成剩下的工作。
【解决方案2】:

当值为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);

【讨论】:

    【解决方案3】:

    您应该使用++a 而不是a++,因为您必须突然更改a 的值。 a 变量将在其 value 返回后递增。

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

    【讨论】:

      【解决方案4】:

      你可以通过多种方式做到这一点。

      1. 带有 reduce() 的布尔值

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

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

        const arrayCount = [false,false,true,false,true].reduce((acc, current) => acc + current, 0);
        console.log(arrayCount);
        
      4. 使用功能

        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. 用于..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】:

        我不太确定,但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 是数字。
        • 其实a是之前返回值的累加值,b是当前被迭代元素的值。对于这样的数组,该值是一个布尔值,直接用于if 条件。如果对它进行数学运算,它将被强制转换为一个数字(01)。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
        猜你喜欢
        • 2013-05-01
        • 1970-01-01
        • 2016-04-08
        • 1970-01-01
        • 2017-01-02
        • 2012-07-28
        • 2012-09-27
        • 2021-10-27
        • 1970-01-01
        相关资源
        最近更新 更多