2016-12-03 3 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'は自分自身に等しくないを:あなたのif(...)arr[i] === arr[i]を追加することができますあなたの問題を解決するために

。 – tkausl

+0

これは重複した質問です:http://stackoverflow.com/questions/32906887/remove-all-falsy-values-from-an-array – HenryDev

+0

実際には 'if(!! arr [i])'はNaNでも有効です –

答えて

0

既に言及したように - NaNは(設計によって)何か(それ自体でさえない)と等しくない。

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は具体的な番号ではなく、のコンセプトです。

2つの「数字」0/0sqrt(-1)を考えてみましょう。これらはどちらも実数空間で定義されていないので、どちらもNaNとなりますが、明らかに異なる値です。

NaNは、基本的に、IEEE-754で表現できなかった未知の値を示しているため、別のNaN,と同じであるとは決して考えられません。

IEEE-754には本当の表現を持たない数字の無数(文字通り)与えられ、そのうちの2つが同じ数であることのチャンスは

:-)無限小あり、これを行うには正しいことです実際に

は、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に強制変換値をフィルタリングです。したがって、フィルタリングするために使用する関数は、値そのものを返します。

関連する問題