2016-08-17 2 views
1

配列からすべての偽値を削除しようとしています。配列からNaNをフィルタリングする

これはこの問題の最適な解決策ではないかもしれませんが、スイッチを使用したいと考えて、NaNを削除する方法はありますか?

function bouncer(arr) { 
    arr=arr.filter(removeFalsy); 
    return arr; 
} 

function removeFalsy(val){ 
    switch(val){ 
     case false: return false; 
     case null: return false; 
     case 0: return false; 
     case "" :return false; 
     case undefined: return false; 
     case NaN: return false; // <=== NaN 
     default: return true; 
    } 
} 

bouncer([false, null, 0, NaN, undefined, ""]); 
//result is: [ NaN ] 

bouncer([1, null, NaN, 2, undefined]); 
//result is: [ 1, NaN, 2 ] 
+0

'NaN == NaN // false' [Num.isNaN](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN)を使用してください。 – vlaz

+0

とにかく、 NaN'は偽の値ですが、あなたは偽の値をすべて除外することができます – vlaz

答えて

6

時には、あなただけの単純な、それを維持する必要があります。

function bouncer(arr) { 
 
    return arr.filter(Boolean); 
 
} 
 

 
console.log(bouncer([false, null, 0, NaN, undefined, ""])); 
 
console.log(bouncer([1, null, NaN, 2, undefined]));

+0

ああ、今私は彼らが偽の値と呼ばれる理由を知ります。ありがとう – JDev

4

NaNしたがって、あなたがNumber.isNaNを使用する必要があり、何と同じではありません。 コメントで説明したように、グローバルisNaNは良い考えではありません。

ありがとうございました。例えば

how-do-you-have-a-nan-case-in-a-switch-statement

+1

例を追加してください。 –

+0

@Vldヒントをありがとう。私は、コア機能が直感的に動作すると仮定したのは間違いでした。それに応じて投稿を変更しました。 – ASDFGerte

+2

@ASDFGerte私は参照してください。私は混乱を理解していますが、isNaNはJSの「既知の」問題の1つにすべきです。私は私のコメントを削除しましたが、重要な部分を追加します: 'isNaN'は非常に悪い名前です - 渡された引数が' NaN'であるかどうかをチェックしません(あなたが名前から推測するもの)。数値に変換された場合、引数_が "NaN"であるかどうか。その実際の名前は 'isThisUsableInAMathematicalExpression'でなければなりません。しかし、それは少し扱いに​​くいと思う。いくつかの例はisNaN( "")// false' 'isNaN(" a ")//真' 'isNaN([1])//偽' 'isNaN([" a " + "" // 0 "しかし" + "a" // NaN " – vlaz

0

filter()方法が提供される機能によって実現 試験に合格するすべての要素を使用して新しい配列を作成参照します。

false以来、null0""undefinedNaNは、試験した場合、したがって、彼らはを返しますJavaScriptですべてFalsy値です。 falseを返しません

function bouncer(arr) { 
    var array = arr.filter(function(val){ 
    return val; 
    }); 
    return array; 
} 

値のみが配列に追加されます。

この質問はquestionと同じです。

関連する問題