无法从数组中删除所有布尔值为false的元素

4

给定一个包含不同数据类型的数组。我编写了一个函数来查找那些值为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: []

我不明白为什么返回布尔false值,例如NaNnull。但它可以正确地移除空字符串("")或undefined

并且我也不理解,为什么在第一种情况下它返回false(这不是预期的结果),而在第二种情况下却没有返回false

非常感谢您的澄清。


1
JavaScript有“falsy”的概念,因此请使用===而不是==。在此处阅读更多信息:https://developer.mozilla.org/en-US/docs/Glossary/Falsy - Dai
2
不要在迭代过程中更改您正在进行迭代的数组,除非您知道自己在做什么 ;) 在每一步检查元素。(提示:被移除的元素之后的元素会发生什么变化?) - Andreas
5个回答

3

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


1
你已经快完成了,但最好检查一下哪些值是假的,而不是比较它们,这个函数就可以解决问题。
const getNonFalsyValues = (arr) => {
  return arr.reduce((arr, current) => {
    if (Boolean(current)) {
        arr.push(current);
    }
    return arr;
  }, []);
}

我希望它能对你有所帮助。

0

只需像这样使用filter

这里的过滤器所做的是仅在其为真时向输出数组中添加值。

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


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

0
在JavaScript中,一些值会被评估为false,例如null、空字符串''undefined。你可以在这里了解更多关于JavaScript的评估信息here
此外,在比较时应该使用===而不是==。请参考this

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接