2015-10-02 9 views
27

配列からすべての偽の値を削除したいと思います。 JavaScriptの偽値はfalse、null、0、 ""、未定義、およびNaNです。配列からすべての偽値を削除する

function bouncer(arr) { 
arr = arr.filter(function (n) { 
    return (n !== undefined && n !== null && n !== false && n !== 0 && n !== "" && isNaN()!=NaN); }); 
    return arr; 
} 

bouncer([7, "ate", "", false, 9, NaN], ""); 

上記は、NaNテストの場合を除いてすべて満足しています。誰かがNaNを含んでいるかどうかに関わらず、配列をチェックする手助けができますか?あなたは「falsy」の値を取り除きたいので

答えて

44

、ちょうどJavaScriptがそのことをやらせる:

function bouncer(arr) { 
    return arr.filter(function(v) { return !!v; }); 
} 

値が「あるとき、フィルタのコールバックのリターンtrueを行います!オペレータのダブル適用真実 "で、falseの場合は"偽 "です。

(あなたのコードはisNaN()を呼ぶが、これに値を渡していません;。数に強制変換のパラメータは、NaN、およびfalseそれ以外の場合は、そのテストは、あなたのために働かなかった理由ですisNaN()機能はtrueを返します。組み込みのブールコンストラクタはかなり電子を行いますので、

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

は、別の答えにすぎLoremIpsumノートとして働くであろうと)

編集 —ノート同じことを!!と同じです。

+0

優秀です。機能的方法のための素晴らしいテクニック –

+1

はこれではありません{return !! v; }と同じ{return v; } – miatech

54

あなたはブールを使用することができます。

var myFilterArray = myArray.filter(Boolean); 
+0

これは賢いです。 –

+0

これはなぜ機能しますか?私はそれを理解することはできません。 – adeluccar

+1

ブール値はブール値のコンストラクタです。これは 'var myFilterArray = myArray.filter((v)=>新しいブール値(v));'と等価です。与えられた値が '0'、' -0'(私が知っている...)、 'null'、' false'、 'NaN'、' undefined'、または空の文字列の場合、結果のブール値は 'false' 。他のものが渡された場合、それは「真」になります。 – LoremIpsum

9

あなたは間違った方法でisNaN()を使用しています。

function bouncer(arr) { 
    return arr.filter(function (n) { 
     return n !== undefined && n !== null && n !== false && n !== 0 && n !== "" && !isNaN(n); 
    }); 

}また

あなたがそれを書き換えることができます:これは別の等価です

function bouncer(arr){ 
    return arr.filter(function(value){ 
     return value; 
    }); 
} 
+1

上記のコードは完全に機能します... return arr.filter(function(value){ 戻り値; })で何が起こっているのかを私に説明できますか? – Vignesh

+1

@Vignesh Array.prototype.filterは、値がtrueであるかどうかをチェックし、それを配列に追加します。上記の値はすべて真実ではありませんhttps://developer.mozilla.org/en-US/docs/Glossary/Truthy – ioncreature

+0

最初のケースでは、フィルターが空でないにもかかわらず文字列を削除していますが、なぜですか? – Humoyun

3

が、説明、解決策:

function bouncer(arr){ 
    return arr.filter(function(value){ 
     return value ? true : false; 
    }); 
} 

これを次のようなものでなければなりませんコードサンプルは、読者に変数value trueまたはfalseと評価され、無名関数はtrueまたはfalseのいずれかのブール値を返し、評価はvalueにマッピングされます。

真理に基づいて配列から値を取り除くというこの方法に慣れていない人や、filter関数に慣れていない(またはそのドキュメントを読んでいない)人にとっては、この例が最もこれは、filter関数の動作を依然として伝えています。もちろん

、あなたのアプリケーションでは、より簡潔な、まだあまり洞察に満ちた、実装を選択することができる:私はこれがarr.filter()メソッドを使用して行うことができます知っている

function bouncer(arr){ 
    return arr.filter(function(value){ 
     return value; 
    }); 
} 
+0

'x? true:false'は常に冗長です。 'return value'で十分です。場合によっては 'Boolean(value)'や '!! value'を使用する必要がありますが、この場合は使用しないでください。 –

+0

私はこの答えを書いて、 'filter'がブール値の戻り値に基づいて値を評価することを示していると考えています。明示的に 'filter'がコールバックの戻り値をブール値として評価するということを明示せずに、 'return value;'は 'filter'関数の新しい人にその概念を表現するのには不十分です。 – sealocal

3

。しかし、私はBoolean()関数を使う方が好きです。私には明らかです。私は少し長いが、それをやった方法をここにあります:

function bouncer(arr) { 
// Don't show a false ID to this bouncer. 

    var falsy; 
    var trueArr = []; 

    for (i = 0; i < arr.length; i++) { 

     falsy = Boolean(arr[i]); 

     if (falsy === true) { 

     trueArr.push(arr[i]); 

     } 

    } 

    return trueArr; 
} 

bouncer([7, "ate", "", false, 9]); 
// returns a new array that is filtered accordingly. 
11
truthyArray = arr.filter(el => el) 

^それはあなたがそれを行う方法

+2

中括弧は暗黙の復帰を無効にするので、空の配列を取得します。 –

+0

良いキャッチ!!!!! –

2

だ、私はより良いこのよう

function bouncer(arr) { 
     arr = arr.filter(function(item) { 
      return item; 
     return arr; 

    bouncer([7, "ate", "", false, 9, NaN, undefined, 0]); 
0
function bouncer(arr) { 
    var result = []; 
    for (var i = 0; i < arr.length; i++) { 
    if (arr[i]) { 
     result.push(arr[i]); 
    } 
    } 
    return result; 
} 

bouncer([7, "ate", "", false, 9]); 
0
function falsy(value) { 
     if (value) { 
     return value; 
     } 
    } 

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

    bouncer([7, "ate", "", false, 9]); 
2
を扱うと思います

バウンサー機能:

上記のすべての作業の回答について

function bouncer(arr) { 
 
    return arr.filter((val) => { 
 
    return !!val; 
 
    }); 
 
} 
 

 
console.log(bouncer([7, "ate", "", false, 9]));

0
function removeFalsy(value){ 

    var val = Boolean(value); 
    if(!val) 
    return false; 
    return true; 
} 

function bouncer(arr) { 

    return arr.filter(removeFalsy); 
} 

bouncer([7, "ate", "", false, 9]); 
1

感謝。問題を解決するための3つのアプローチがあります。第3の解決策はあなたのアプローチによる問題を解決しました。

1. 
function bouncer(arr) { 
    return arr.filter(function(val){ 
     return val; 
    }); 
} 

2. 
function bouncer(arr) { 
return arr.filter(Boolean); 
} 
3. 
    function bouncer(arr) { 
    return arr.filter(function(val){ 
     return val !== false && val !== "" && !(Number.isNaN(val)) && val !== 
undefined && val !== 0 && val !== null; 
    }); 
} 
0
function bouncer(arr) { 

    function filterFalse(value) { 
     var a = Boolean(value); 
     if (a === true) { 
      return a; 
     } 
     return a; 
    } 

    function filterArray(x) { 
     var y = filterFalse(x); 
     if (y) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    var newArr = arr.filter(filterArray); 
    return newArr; 
} 

bouncer([1, null, NaN, 2, undefined]); 
0
function bouncer(arr) { 

// Don't show a false ID to this bouncer. 

for (var i = 0; i < arr.length; i++) { 
     if (!arr[i]) { 
      arr.splice(i, 1); 
      i = i-1; 
     } 
    } 
    return arr; 

} 

bouncer([7, "ate", "", false, 9]); 
+0

質問はNaNについてです – user7294900

0

これが私の考え...

function bouncer(arr) { 
 
    // Don't show a false ID to this bouncer. 
 
    var result = []; 
 
    
 
    function isGood(obj){ 
 
     if(!Boolean(obj)){ 
 
     return false; 
 
     } else { 
 
     return true; 
 
     } 
 
    } 
 
    
 
    for (var i=0; i < arr.length; i++){ 
 
     if (isGood(arr[i]) === true){ 
 
     result.push(arr[i]); 
 
     } 
 
    } 
 
    return result; 
 
} 
 

 
console.log(bouncer([7, "ate", "", false, 9]));

関連する問題