【问题标题】:Can't remove all Boolean == false in array [duplicate]无法删除数组中的所有布尔 == false [重复]
【发布时间】:2019-06-03 10:04:58
【问题描述】:

给定一个具有不同数据类型的数组。我编写了一个函数来查找那些为false 的值并返回没有falsy 值的数组。

例如:

[7, "ate", "", false, 9] should return [7, "ate", 9].

这是我当前的代码:

function bouncer(arr)
{
    for (var i = 0; i < arr.length; i++)
    {
        if (Boolean(arr[i]) == false)
        {
            arr.splice(i, 1);
        }
     }
     console.log(arr);
}

但是,有一个问题:

一)

In case of Input: bouncer([7, "ate", "", false, 9])
It returns: [ 7, 'ate', false, 9 ]
But it should return: [7, "ate", 9]

II.)

In case of input: `bouncer([false, null, 0, NaN, undefined, ""]);`
It returns: [ null, NaN, '' ]
But it should return: []

我不明白为什么它返回布尔 false 值,例如 NaNnull。但它会正确拼接空字符串 ("") 或 undefined 等值。

我也不明白,为什么在第一种情况下它返回false(这不是故意的),但在第二种情况下它不返回false

非常感谢您的澄清。

【问题讨论】:

  • JavaScript 有“假”的概念,所以用=== 代替==。在这里阅读更多:developer.mozilla.org/en-US/docs/Glossary/Falsy
  • 不要改变你正在迭代的数组,除非你知道你在做什么;)检查每一步的元素。 (提示:被移除的元素之后的元素发生了什么?)

标签: javascript arrays boolean splice


【解决方案1】:

像这样简单地使用filter

这里过滤器的作用是只有当它为真时才在输出数组中添加值。

let arr = [false, null, 0, NaN, undefined, "", 1 , 123];
let op = arr.filter(value => value);
console.log(op)

【讨论】:

    【解决方案2】:
    const bouncer = (arr) => arr.filter(val => !!val);
    

    【讨论】:

      【解决方案3】:

      您几乎完成了,但最好检查哪些值是虚假的而不是比较它们,所以这个函数可以解决问题

      const getNonFalsyValues = (arr) => {
        return arr.reduce((arr, current) => {
          if (Boolean(current)) {
              arr.push(current);
          }
          return arr;
        }, []);
      }
      

      希望对你有帮助。

      【讨论】:

        【解决方案4】:

        在 JavaScript 中,某些值的计算结果为 false,例如 null、空字符串 ''undefined。您可以在 JavaScript here 中查看更多关于评估的信息。

        您还应该在比较中使用=== 而不是==。见this

        【讨论】:

          【解决方案5】:

          正如其他人所说,您可以为此目的使用filter()。最短的方法是:

          const array = [false, null, true, 0, NaN, undefined, "", "Hola Mundo"];
          console.log(array.filter(Boolean));
          .as-console {background-color:black !important; color:lime;}
          .as-console-wrapper {max-height:100% !important; top:0;}

          但是,回到您的代码,您应该注意splice() 方法会在检测到falsy 值时更改数组(因为删除了一个元素)。换句话说,arr.length 在循环执行时动态减少,但i 变量不断增加。这会生成循环实际上不会循环数组上的所有元素。要解决此问题,您必须在从数组中删除元素时减少变量 i 的值。检查下一个代码:

          function bouncer(arr)
          {
              for (var i = 0; i < arr.length; i++)
              {
                  if (Boolean(arr[i]) === false)
                  {
                      arr.splice(i, 1);
                      i = i - 1;
                  }
              }
          
              console.log(arr);
          }
          
          bouncer([false, null, true, 0, NaN, undefined, "", "Hola Mundo"]);
          .as-console {background-color:black !important; color:lime;}
          .as-console-wrapper {max-height:100% !important; top:0;}

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-12-07
            • 2020-01-16
            • 1970-01-01
            • 2019-08-10
            • 1970-01-01
            • 2020-05-08
            • 2018-01-26
            • 2018-03-24
            相关资源
            最近更新 更多