【问题标题】:Array filter is not returning correct for Zero?数组过滤器没有返回正确的零?
【发布时间】:2020-02-18 11:13:09
【问题描述】:

function zeroCount(arr){       
   const zero = arr.filter(el=>{
            if(el===0){
                return el ;
            }
        });
    return zero.length ; // but it returns 0. I want it to return 3.
}

console.log(zeroCount([2,3,0,5,0,2,0]));

我想退回号码。使用过滤器的数组中存在零。

【问题讨论】:

标签: javascript arrays node.js filter


【解决方案1】:

对于过滤,您需要返回一个类似布尔值的值,例如 truthyfalsy 值。

更好的方法是直接计算零值。

function zeroCount(arr) {
    return arr.reduce((s, v) => s + !v, 0);
}

console.log(zeroCount([2, 3, 0, 5, 0, 2, 0]));

【讨论】:

    【解决方案2】:

    function zeroCount(arr){       
       const zero = arr.filter(el=> el === 0);
       return zero.length;
    }
    
    console.log(zeroCount([2,3,0,5,0,2,0]));

    【讨论】:

      【解决方案3】:

      filter 回调函数应该返回布尔值并且你没有处理错误的情况

      你的函数应该是这样的

      function zeroCount(arr){       
        const zero = arr.filter(el=>{
           return el === 0;
        });
      
        return zero.length; // it returns 3
      }
      

      或使用简写

      function zeroCount(arr){       
        const zero = arr.filter(el=> el === 0);
      
        return zero.length; // it returns 3
      }
      
      

      【讨论】:

        【解决方案4】:

        过滤器只会在您返回“真实”值时添加元素。目前,您正在返回 e1,为 0。(这是假的)。

        只需返回 true。

        function zeroCount(arr) {
          const zero = arr.filter(el => {
            if (el === 0) {
              return true;
            }
          });
          return zero.length; // but it returns 0. I want it to return 3.
        }
        
        console.log(zeroCount([2, 3, 0, 5, 0, 2, 0]));

        【讨论】:

          【解决方案5】:

          现在,如果元素为 0,则返回 0。过滤器的工作原理是期望一个布尔值,它是否应该将当前元素保留在新数组中。

          这里不走运的部分是您返回 0,这将转换为 false。

          function zeroCount(arr){       
             const zero = arr.filter(el=>{
                      if(el===0){
                          return el; // This returns 0 so it won't be added to the filtered array
                      }
                  });
              return zero.length ; // but it returns 0. I want it to return 3.
          }
          
          console.log(zeroCount([2,3,0,5,0,2,0]));


          这会起作用

          function zeroCount(arr){       
             const zero = arr.filter(el=> el === 0); // if the element is 0 then el === 0 will resolve to true and the element will be added to the filer array
              return zero.length ; // returns 3
          }
          
          console.log(zeroCount([2,3,0,5,0,2,0]));

          【讨论】:

            【解决方案6】:

            你可以使用如下逻辑:

            [....].filter(x => x===0).length
            

            所以你的代码将是

                function zeroCount(arr){       
                  return arr.filter(x => x===0).length;
                }
                
                console.log(zeroCount([2,3,0,5,0,2,0]));

            filter() 方法创建一个新数组,其中包含所有通过所提供函数实现的测试的元素。 .length() 将在此处获取该数组的长度。

            【讨论】:

              【解决方案7】:

              函数filter 的处理程序应该返回一个布尔值

              以下方法假设只有数字。

              function zeroCount(arr) {
                return arr.filter(el => !el).length;
              }
              
              console.log(zeroCount([2, 3, 0, 5, 0, 2, 0]));

              前面的方法会生成一个不必要的数组,因此,如您所愿,更好的方法是使用函数reduce,如下所示:

              function zeroCount(arr) {
                return arr.reduce((r, el) => r + !el, 0);
              }
              
              console.log(zeroCount([2, 3, 0, 5, 0, 2, 0]));

              【讨论】:

                【解决方案8】:

                您需要了解过滤器的工作原理。

                过滤器功能将根据您从内部返回的真或假来选择或删除元素。

                你返回的 el 是 0。JS 中的 0 是假的。这就是你的代码不起作用的原因。

                两种可能的解决方案 1)

                function zeroCount(arr){       
                 const zero = arr.filter(el=>{
                        if(el===0){
                            return true ;
                        }
                    });
                   return zero.length ; // but it returns 0. I want it to return 3.
                 }
                

                2)

                function zeroCount(arr){       
                  const zero = arr.filter(el=> !el);
                  return zero.length ; // but it returns 0. I want it to return 3.
                 }
                

                3) 炫耀

                zeroCount = (arr) => arr.filter(el => !el).length
                

                【讨论】:

                  【解决方案9】:

                  下面的方法有助于返回数组中假值的计数。

                  function zeroCount(arr){       
                     return arr.filter(elem => !elem).length;
                  }
                  
                  console.log(zeroCount([2,3,0,5,0,2,0]));

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2023-03-17
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-08-30
                    • 2019-11-23
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多