2016-04-26 63 views
-1

我想寫一個快速函數來過濾出任何falsy值。這似乎抓住一切,除了'空'。這個函數爲什麼會過濾掉'空'值?

請幫忙!

function noFalsy(arr) { 

var none=function(val){ 
     switch (val){ 
      case false: 
      case null: 
      case "": 
      case 0: 
      case undefined: 
      case NaN: 
      return false; 
      default: 
      return true; 
     } 
     }, 
    ans=[]; 
ans=arr.filter(none); 


return ans; 
} 
+1

它不能爲NaN的工作,因爲開關使用嚴格的比較和NaN!== NaN –

+2

如果你只是尋找虛假,你可以做'.filter(布爾)' – Bergi

+0

你發佈的代碼*會爲我過濾掉'null'嗎?你是否傳入了「null」? – Bergi

回答

2

你不能檢查這樣的NaN

在JavaScript中,NaN !== NaNtrue。這就是爲什麼你應該使用Number.isNaN來檢查一個值是否爲NaN;這也是爲什麼你的過濾器不適用於NaN值的原因。 switch語句永遠不會到達NaN案例的正文,因爲內部相等性檢查總是失敗。

如果你只是想篩選出falsy值,你可以僅僅依靠自己的falsiness,而不是檢查自己的精確值,這是快了很多:

[1, null, undefined, NaN, 0, "", true].filter(x => x); // [1, true] 
0

首先,當前的代碼過濾掉null值(但不會過濾掉NaN)。 See what I'm talking about

在你的例子中,注意NaN !== NaN是很重要的,因爲現在有辦法判斷「不是數字」是否與另一個不是數字的元素相同。

更簡單的方法從陣列省略任何falsy值是通過陣列進行迭代,並返回是truthy任何值:

function noFalsy(arr){ 
    var output = []; 
    arr.filter(function(element){ 
     // If the element is not falsy, add it to our output array 
     if(element){ 
      output.push(element); 
     } 
    }); 
    return output; 
} 

console.log(noFalsy([1, true, 0, null, false, NaN])); // => [1, true] 

Working Fiddle

相關問題