无法删除数组中的所有 Boolean == false

Can't remove all Boolean == false in array

给定一个具有不同数据类型的数组。我编写了一个函数来查找 false 和 return 数组中没有 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: []

我不明白为什么它 return 是像 NaNnull 这样的布尔假值。但它正确拼接空字符串 ("") 或 undefined.

等值

而且我也不明白,为什么在第一种情况下它 returns false (这不是故意的),但在第二种情况下它不 return s false.

非常感谢您的澄清。

只需像这样使用filter

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

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

const bouncer = (arr) => arr.filter(val => !!val);

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

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

希望对您有所帮助

在 JavaScript 中,某些值的计算结果为 false,例如 null、空字符串 ''undefined。您可以在 JavaScript here.

中查看有关评估的更多信息

此外,您应该在比较中使用 === 而不是 ==。参见 this

正如其他人所说,您可以使用 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;}