在 javascript 数组中查找 NaN 的索引

Posted

技术标签:

【中文标题】在 javascript 数组中查找 NaN 的索引【英文标题】:Find index of NaN in a javascript array 【发布时间】:2011-07-14 17:51:54 【问题描述】:
[1, 2, 3].indexOf(3) => 2

[1, 2, NaN].indexOf(NaN) => -1

[1, NaN, 3].indexOf(NaN) => -1

【问题讨论】:

如果您只想知道数组是否包含NaN,可以使用Array.prototype.includes[NaN].includes(NaN) /* true */ 【参考方案1】:

你可以使用Array.prototype.findIndex方法来找出数组中NaN的索引

let index = [1,3,4,'hello',NaN,3].findIndex(Number.isNaN)
console.log(index)

您可以使用Array.prototype.includes 检查数组中是否存在 NaN。虽然它不会给你索引!它将返回一个布尔值。如果存在 NaN,则返回 true,否则返回 false

let isNaNPresent = [1,2,NaN,'ball'].includes(NaN)
console.log(isNaNPresent)

不要使用Array.prototype.indexOf

您不能使用Array.Prototype.indexOf 在数组中查找NaN的索引。因为indexOf在内部使用strict-equality-operator,而NaN === NaN的计算结果为false.所以 indexOf 将无法检测到数组中的 NaN

[1,NaN,2].indexOf(NaN) // -1

使用Number.isNaN 代替isNaN

这里我选择Number.isNaN 而不是isNaN。因为isNaNstring literal 视为NaN。另一方面,Number.isNaN 仅将NaN 文字视为NaN

isNaN('hello world') // true
Number.isNaN('hello world') // false

或者,编写你自己的逻辑:

您可以编写自己的逻辑来查找 NaN。正如您已经知道的那样,NaN 是 javascript 中唯一的值,即 not equal to itself。这就是我建议不要使用Array.prototype.indexOf的原因。

NaN === NaN // false

我们可以利用这个思路编写自己的isNaN函数。

[1,2,'str',NaN,5].findIndex(e=>e!=e) // 3

【讨论】:

这里只传入 isNaN 函数不是更清楚吗?此外,findIndex 可用于比箭头函数更多的实现,因此它所做的只是降低了此答案的可移植性。 @WillS 我已经修改了我的答案【参考方案2】:

NaN 被定义为不等于任何东西(甚至不等于它自己)。见这里:http://www.w3schools.com/jsref/jsref_isNaN.asp

【讨论】:

会在我的计时器用完时投票并接受。那只是迟钝。 向 IEEE 解释;这是他们的浮点标准将NaN 定义为不等于任何东西。 (也就是说,在 RDBMS 中将其视为 NULL。) -1 也用作错误值。 -1 != -1 有意义吗? @mcandre,它没有迟钝。 NaN 的全部意义在于表示在域中被认为不可表示的事物。这不是一种类型的东西,它有很多。例如,您不可能说 -1 的平方根 i 等于零除以自身(不确定)。然而它们都是 NaN。 我明白了。我愿意。但从实际的角度来看,如果我想从数组中提取所有 NaN,将元素与 NaN 进行比较而不是调用 isNaN() 会很有用。【参考方案3】:

您必须查看每个项目以返回一个数组 NaN 值的索引-

function findNaNs(arr)
    return arr.map(function(itm, i)
        if(isNaN(itm)) return i;
        return false;
    ).filter(function(itm)
        return itm;
    );

findNaNs([1, NaN, 3, 4, 'cat'/3])

//或找到第一个-

function firstNaN(arr)
    var i= 0, L= arr.length;
    while(i<L)
        if(isNaN(arr[i])) return i;
        ++i;
    
    return -1;

【讨论】:

谢谢你,肯尼贝克。围绕这个问题编写代码并不难,只是不方便。 永远不要使用isNaN,它已经坏了。它隐式地强制值类型。对于isNaN(undefined)isNaN()(但不是isNaN([]))等,您会得到true。请使用与自身进行比较:x !== xNaN 是唯一不等于 self 的值)。跨度> 如果是第一个元素,第一个例程找不到NaN。

以上是关于在 javascript 数组中查找 NaN 的索引的主要内容,如果未能解决你的问题,请参考以下文章

Numpy数组获取不是NaN的数组的子集/切片

使用 simd 在双精度数组中查找 nan

如何在 mongodb 中查找包含 NaN 值的字段的 $avg 和 $sum?

Javascript 数组意外地充满了 NaN

javascript数组去重(undefined,null,NaN)

106.数组二分查找法