从数组中过滤 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() 方法创建一个包含所有通过的元素的新数组 由提供的函数实现的测试。

由于falsenull0""undefinedNaN 在 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("") //falseisNaN("a") //trueisNaN([1])//falseisNaN(["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的主要内容,如果未能解决你的问题,请参考以下文章

Falsy Bouncer(过滤数组假值)

从数组中删除Falsy值

从具有 NaN 的多维数组中找出最小值

从 pandas 转换为 numpy 后,如果数组包含 nan,则删除“nan”或减少 numpy 数组的长度 [重复]

从 X 数组中删除 NaN 行以及 Y 中的相应行

Falsy Bouncer 过滤数组假值