从数组中过滤 NaN
Posted
技术标签:
【中文标题】从数组中过滤 NaN【英文标题】:Filtering NaN from an array 【发布时间】:2016-12-24 16:25:06 【问题描述】:我正在尝试从数组中删除所有虚假值。
我知道这可能不是这个问题的最佳解决方案,但考虑到我想使用开关,有没有办法去除 NaN?
function bouncer(arr)
arr=arr.filter(removeFalsy);
return arr;
function removeFalsy(val)
switch(val)
case false: return false;
case null: return false;
case 0: return false;
case "" :return false;
case undefined: return false;
case NaN: return false; // <=== NaN
default: return true;
bouncer([false, null, 0, NaN, undefined, ""]);
//result is: [ NaN ]
bouncer([1, null, NaN, 2, undefined]);
//result is: [ 1, NaN, 2 ]
【问题讨论】:
NaN == NaN //false
使用Number.isNaN
无论如何,因为NaN
是一个假值,你可以过滤掉所有假值
可能的重复:Filter null from an array in javascript 和 How to filter() out NaN, null, 0, false in an array (JS)。
【参考方案1】:
filter() 方法创建一个包含所有通过的元素的新数组 由提供的函数实现的测试。
由于false
、null
、0
、""
、undefined
和 NaN
在 JavaScript 中都是 Falsy 值,因此它们将返回 false 测试时。
function bouncer(arr)
var array = arr.filter(function(val)
return val;
);
return array;
只有不返回 false的值才会被添加到数组中。
这个问题和这个question一样。
【讨论】:
【参考方案2】:NaN
不等于任何东西,因此您需要使用Number.isNaN。
正如 cmets 中所解释的,全局 isNaN 不是一个好主意。
感谢您指出这一点。
示例见how-do-you-have-a-nan-case-in-a-switch-statement
【讨论】:
@Vld 感谢您的提示。我再次犯了一个错误,即假设核心功能会直观地表现出来。相应地更改了帖子。 @ASDFGerte 我明白了。我理解这种混乱,但isNaN
应该是 JS 的那些“已知”问题之一。我已经删除了我的评论,但我会添加其中的重要部分:isNaN
的名称非常糟糕 - 它不会检查传入的参数是否为 NaN
(您可以从名称中猜到)但是如果转换为数字,参数是否将是 NaN
。它的实际名称应该是isThisUsableInAMathematicalExpression
。不过,我想这有点笨拙。一些例子isNaN("") //false
isNaN("a") //true
isNaN([1])//false
isNaN(["a"]) //true
逻辑是+""//0
但+"a"//NaN
【参考方案3】:
有时你只需要保持简单:
function bouncer(arr)
return arr.filter(Boolean);
console.log(bouncer([false, null, 0, NaN, undefined, ""]));
console.log(bouncer([1, null, NaN, 2, undefined]));
【讨论】:
哦,现在我明白为什么它们被称为虚假值了。谢谢以上是关于从数组中过滤 NaN的主要内容,如果未能解决你的问题,请参考以下文章
从 pandas 转换为 numpy 后,如果数组包含 nan,则删除“nan”或减少 numpy 数组的长度 [重复]