2016-12-03 4 views
1
function bouncer(arr) { 
    var array = [false, null, 0, NaN, undefined, ""]; 
    var result = []; 
    for (var i = 0; i < arr.length; i++) { 
     if (array.indexOf(arr[i]) === -1) { 
      result.push(arr[i]); 
     } 
    } 
    return result; 
} 
ex : bouncer([7, "ate", "", false, 9]) should return [7, "ate", 9]. 

Привет всем, Я пытаюсь удалить все ложно значения, которые во входном массиве, но как-то, когда я бегу bouncer([false,null, 0, NaN, undefined, ""]); я [NaN] в качестве возвращаемого значения в то время как я ожидал пустой массив. Кто-нибудь знает, почему функция возвращает ложные значения?Как метод indexOf возвращает ложное значение?

+2

'NaN' не равен самому себе. – tkausl

+0

Это повторяющийся вопрос: http://stackoverflow.com/questions/32906887/remove-all-falsy-values-from-an-array – HenryDev

+0

Фактически 'if (!! arr [i])' работает даже для NaN –

ответ

0

Как уже упоминалось - NaN (по дизайну) не равен ни на что (даже не сам).

Чтобы решить проблему, то вы можете добавить arr[i] === arr[i] к вашему if(...):

function bouncer(arr) { 
 
    var array = [false, null, 0, undefined, ""]; 
 
    var result = []; 
 
    for (var i = 0; i < arr.length; i++) { 
 
     if (array.indexOf(arr[i]) === -1 && (arr[i] === arr[i])) { 
 
      result.push(arr[i]); 
 
     } 
 
    } 
 
    return result; 
 
} 
 
console.log(bouncer([7, "ate", "", false, 9])); 
 
console.log(bouncer([false,null, 0, NaN, undefined, ""]));

5

Это потому, что NaN действительно концепция, а не конкретное число.

Рассмотрите два «цифры» 0/0 и sqrt(-1). Ни один из них не определен в пространстве с вещественным числом, поэтому оба дают NaN, но они явно отличаются друг от друга.

Потому что NaN в основном указывает на неизвестное значение, которое не может быть представлено в IEEE-754, оно никогда не считается равным другому NaN, даже сам.

Это правильная вещь, чтобы сделать, потому что, учитывая бесконечность (буквально) чисел, которые не имеют реального представления в IEEE-754, шансы двух из них одинаковое количество ничтожно малы :-)

в самом деле, многие реализации isNaN() зависит от этой функции, а именно (псевдо-код):

define isNaN(n): 
    return n != n 

чтобы действительно решить эту проблему, один из способов заключается в повторном переместить NaN из массива проверки и немного изменить условный:

var array = [false, null, 0, undefined, ""]; 
: 
if ((array.indexOf(arr[i]) === -1) && (! isNaN(arr[i])) { 
0

Существует уже ответ, который объясняет, почему NaN включен в результате. Что касается решения вашей проблемы, следующее должно хватить:

function bouncer(arr) { 
    return Array.isArray(arr) ? arr.filter(v => v) : undefined; 
} 

Идея здесь мы отфильтровать значения, которые принудить к true в логическом контексте. Таким образом, функция, которую мы используем для фильтрации, просто возвращает само значение!