2016-12-03 35 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方法如何返回falsely值?

+2

'NaN'不等於本身。 – tkausl

+0

這是一個重複的問題:http://stackoverflow.com/questions/32906887/remove-all-falsy-values-from-an-array – HenryDev

+0

實際上,如果(!! 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/0sqrt(-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在布爾上下文中的值。因此,我們用來過濾的函數只返回值本身!