Найти индекс NaN в массиве JavaScript - PullRequest
13 голосов
/ 14 марта 2011
[1, 2, 3].indexOf(3) => 2

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

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

Ответы [ 3 ]

11 голосов
/ 14 марта 2011

NaN определяется не равным чему-либо (даже самому себе). Смотрите здесь: http://www.w3schools.com/jsref/jsref_isNaN.asp

7 голосов
/ 15 февраля 2018

Вы можете использовать метод 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 использует оператор строгого равенства для внутреннего использования и NaN === NaN оценивается как false. Поэтому indexOf не сможет обнаружить NaN внутри массива

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

Используйте Number.isNaN вместо isNaN:

Здесь я выбираю Number.isNaN более isNaN . Потому что isNaN рассматривает string 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
2 голосов
/ 14 марта 2011

Вы должны посмотреть на каждый элемент, чтобы вернуть массив из индексов, которые являются значениями 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;
}
...