从数组中删除所有虚假值

IT技术 javascript arrays
2021-02-07 08:58:25

我想从数组中删除所有虚假值。JavaScript 中的假值是 false、null、0、""、undefined 和 NaN。

function bouncer(arr) {
 arr = arr.filter(function (n) { 
    return (n !== undefined && n !== null && n !== false && n !== 0 && n !== "" && isNaN()!=NaN); });
  return arr;
}

bouncer([7, "ate", "", false, 9, NaN], "");

除了 NaN 测试用例之外,以上所有内容都得到满足。有人可以帮我检查数组是否包含 NaN 吗?

6个回答

您可以使用布尔值:

var myFilterArray = myArray.filter(Boolean);
@LoremIpsum 它相当于var myFilterArray = myArray.filter((v) => Boolean(v));,没有new. new Boolean将创建真实的布尔对象,这意味着filter接受所有元素,而这又相当于var myFilterArray = myArray.filter(() => true);.
2021-03-25 08:58:25
这是一个聪明的
2021-04-03 08:58:25
@LoremIpsum:如果您尝试这样做,您会发现它永远不会过滤掉任何内容,因为Boolean用作构造函数会创建始终为真的布尔包装对象(JavaScript 最愚蠢的功能,根本没有任何用途)。Boolean(v)而不是new Boolean(v),这是Boolean直接传递实现的,转换为布尔值。
2021-04-08 08:58:25
Boolean 是布尔值的构造函数。这相当于var myFilterArray = myArray.filter((v) => new Boolean(v));. 如果给定值0-0(我知道...), , ,null 或空字符串,所产生的布尔会如果其他任何事情都通过了,那就是falseNaNundefinedfalsetrue
2021-04-12 08:58:25
哦,为什么这是在最底部?我刚刚发布这个是因为所有的答案似乎都很棘手
2021-04-12 08:58:25

既然你想摆脱“假”值,就让 JavaScript 做它的事情:

function bouncer(arr) {
  return arr.filter(function(v) { return !!v; });
}

!运算符的双重应用 将使过滤器回调true在值为“真”和“假”false时返回。

(您的代码正在调用isNaN()但未传递值;这就是该测试对您不起作用的原因。如果其参数在强制为数字时为isNaN()函数返回否则返回。)trueNaNfalse

编辑- 请注意

function bouncer(arr) {
  return arr.filter(Boolean);
}

也可以像 LoremIpsum 在另一个答案中指出的那样工作,因为内置的布尔构造函数与!!.

这不是{ return !!v; } 与 { return v; 相同 }
2021-04-08 08:58:25
从技术上讲,您甚至不需要!!here 因为filter是测试真实性,而不是与true.
2021-04-11 08:58:25
优秀的。功能方法的好技术
2021-04-13 08:58:25
truthyArray = arr.filter(el => el)

^ 你就是这样做的

花括号禁用隐式返回,因此您将获得空数组。
2021-03-19 08:58:25

使用这个简单的过滤器可以:

array.filter(Boolean)

你可以在这里阅读更多Boolean

简单而最佳的解决方案!
2021-03-20 08:58:25

你用isNaN()错了。它应该类似于以下内容:

function bouncer(arr) {
   return arr.filter(function (n) { 
       return n !== undefined && n !== null && n !== false && n !== 0 && n !== "" && !isNaN(n); 
   });

}

你也可以重写它:

function bouncer( arr ){
    return arr.filter( function( value ){
        return value;
    });
}
上面的代码完美运行......你能解释一下 return arr.filter( function( value ){ return value; }); 中发生了什么吗?
2021-03-22 08:58:25
@Vignesh Array.prototype.filter 检查值是否为真,然后将其添加到数组中。以上所有值都不是真的developer.mozilla.org/en-US/docs/Glossary/Truthy
2021-03-28 08:58:25
在第一种情况下,即使字符串不为空,过滤器也会删除字符串,为什么?
2021-04-04 08:58:25