无法删除数组中的所有布尔值== false

时间:2019-01-08 17:00:30

标签: javascript arrays boolean splice

给出一个具有不同数据类型的数组。我编写了一个函数来查找那些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);
}

但是,有一个问题:

I。)

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: []

我不明白为什么它返回布尔假值,例如NaNnull。但是它可以正确拼接掉空字符串("")或undefined之类的值。

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

非常感谢您的澄清。

5 个答案:

答案 0 :(得分:1)

您差不多完成了,但是最好检查哪些值是虚假的,而不是比较它们,所以此功能可以解决问题

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

希望它能对您有所帮助。

答案 1 :(得分:1)

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

const array = [false, null, true, 0, NaN, undefined, "", "Hola Mundo"];
console.log(array.filter(Boolean));

但是,回到您的代码,您应该注意,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"]);

答案 2 :(得分:0)

像这样简单地使用filter

此处的过滤器是仅在为true时才在输出数组中添加值。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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