web-dev-qa-db-ja.com

NaN、null、0、false in array(JS)をフィルターする方法

NaN、null、0、false in arrayを除外するように求められました。

幸いなことに私は質問に答えました。

function bouncer(arr) {
  function filterer(arr) {
     return arr > 0|| isNaN(arr) === true;
  }
  arr = arr.filter(filterer);
  return arr;
}

//example input
bouncer([0, 1, 2, 3, 'ate', '', false]); //output [1, 2, 3, 'ate']

しかし、問題は、どうやって答えを思いついたのかわからないというか、むしろそれがどのように機能するのかわからないということです。特にarr>すべての配列でループを繰り返すことなく、arrがarr [1]、arr [2]などで既にあることをフィルターがどのように認識したか。

または、単にコードの動作方法を説明するだけです。 [私はそれを明確に説明しようとしました---]

11
Fhrey

Array.filterdocs をご覧ください。特にコールバックの引数に注意してください。

配列の各要素をテストする関数。引数(要素、インデックス、配列)で呼び出されます。要素を保持するにはtrueを返し、そうでない場合はfalseを返します。

したがって、あなたの場合、arrが要素です(そして名前が不十分なので、混乱します)。フィルターループは配列をループし、すべてのアイテムに対して、現在の位置にある要素をarrとして渡すコールバックを呼び出します。

他の人がコメントで指摘したように、フィルターコールバックのロジックは実際には負の値に欠陥がありますが、配列に負の値が含まれないことがわかっている場合は問題になりません(ただし、それは仮定することは危険です) )。

そしてもちろん、内部的には、これは配列をループしています。配列内の各要素に触れずに(並べ替えられていない)配列をフィルター処理することはできません。リンク内のポリフィルを見て、mightがどのように機能するかを理解してください(これは実装の詳細であり、異なるJavaScriptエンジンで異なる場合があるため、間違いなくどこかにループが含まれます)、それはあなたの配列をループし、コールバック(引数に注意してください)を呼び出し、コールバックがtrueを返す場合、結果の配列にプッシュされます。

4
Matt Burland

配列のNaNnull0falseを除外するように求められた場合、ソリューションは実際には機能しません。

あなたの入力:

bouncer([0, 1, 2, 3, 'ate', '', false, NaN]);

次の出力を取得します。

[1, 2, 3, 'ate', NaN]

すべての「偽の」値を除外するには、単にBooleanを使用できます。

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

bouncer([0, 1, 2, 3, 'ate', '', false, NaN]);

出力:

[1, 2, 3, 'ate']

Booleanコンストラクターも関数なので、「真の」引数の場合はtrueを、「偽の」引数の場合はfalseを返します。値が省略されているか、0-0nullfalseNaNundefined、または空の場合文字列("")、オブジェクトの値はfalseです。オブジェクトまたは文字列"false"を含む他のすべての値は、trueの初期値でオブジェクトを作成します。

73
Bluefin

Booleanの代わりに恒等関数を使用することもできます。

function bouncer(arr) {
  return arr.filter(x => x);
}
8
Trevor Dixon

また、無料のコードキャンプファルシーバウンサーアルゴリズムにも取り組んでいます。最も簡単な方法は次のとおりです。

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

filter() メソッドは、提供された関数によって実装されたテストに合格したすべての要素を含む新しい配列を作成します。

falsenull0""undefinedおよびNaNはすべてJavaScriptのFalsy値であるため、戻りますfalseテスト時。

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

falseを返さない値のみがarrayに追加されます。

2
Ravi Kumar Seth

ブール値が期待される場合、すべての不要な要素がfalseにキャストされるという仮定に基づいて、よりエレガントになりません。

function clear (arr){
   var stripped = [];
   for (i = 0, len = arr.length; i < len; i++){
      if (arr[i])
         stripped.Push(arr[i]);
   }
   return stripped;
}
1
adam bahdaj

私はコーディングの初心者なので、ロジックはプリミティブなブール値を使用してフィルタリングされたアイテムを比較しましたが、これはブール値オブジェクト参照を読む前のことでした。値が省略されるか、0、-0、null、false、NaN、undefined、または空の文字列( "")である場合、オブジェクトの初期値はfalseです。オブジェクトまたは文字列「false」を含む他のすべての値は、初期値がtrueのオブジェクトを作成します。したがって、フィルターはtrueまたはfalseの場合に値を返すため、フィルターは値を返すため、値がtrueの場合は値を返す必要があります。また、フィルタ方法についてすべてを学んだわけではありません。調査したものについては、もう少し情報がありますので、ここで説明します。」

メソッドを再定義します(既に存在し、理解のためだけです)。フィルターメソッドは、述語と呼ばれる関数を受け入れます。これは、値を受け取り、trueまたはfalseを返す関数です。

Var resultsは空の配列で、Pushメソッドで結果がプッシュされます。これでforEachメソッドを使用します(このコンテキストでは、これは配列プロトタイプに適用されます。つまり、array.method(args)insのsintaxを使用して、定義するすべての配列でフィルターメソッドを使用できることを意味します。この場合array.filter(args))いくつかのリソース https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype

次に、forEachメソッドを使用して、配列上のすべてのアイテムで操作を実行します。次に、述語関数を配列のitchアイテムに適用し、trueを返す場合、結果に追加します。

Array.prototype.filter = function(predicate){   
    var results = [];

    this.forEach(function(item) {   
        if (predicate(item)) {
            results.Push(item);
        }

    });
};

// -------------------------------正しい解決策--------------- ------------

function bouncer (arrToFilter){

    return arrToFilter.filter(Boolean);
}

// ----------フィルターメソッドのないコード---------

function bouncerNoFilterMethod(arrToFilter){
    var results = [];

    arrToFilter.forEach(function(arrToFilter){
        if(arrToFilter){
            results.Push(arrToFilter);
        }
    });

    return  results;    
}

console.log(bouncerNoFilterMethod([7, "ate", "", false, 9]));
console.log(bouncerNoFilterMethod(["a", "b", "c"]));
console.log(bouncerNoFilterMethod([false, null, 0, NaN, undefined, ""]));
console.log(bouncerNoFilterMethod([1, null, NaN, 2, undefined]));
console.log(bouncer([7, "ate", "", false, 9]));
console.log(bouncer(["a", "b", "c"]));
console.log(bouncer([false, null, 0, NaN, undefined, ""]));
console.log(bouncer([1, null, NaN, 2, undefined]));

これがメソッドの理解に役立つことを願っています。最初に理解していなかったのは、メソッドの述語である関数を渡すことでした。ここに間違いがある場合は、修正を提案してください。

ブールは「FreeCodeCamp」チャレンジの最も簡単な修正/回答のように見えますが、「なぜ」「どのように」のコツをつかむためにいくつかのことを試してみると便利かもしれません。

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

これは、値を返す関数(コールバック)を使用して、フィルターを通過するすべてを評価します。 nullなどが返さない値を返さない場合、返り値には含まれません。少なくともこの方法は、単にテストに合格するのではなく、その理由を理解するのに役立ちました。

0
Holden

配列の各要素をテストする関数。引数(要素、インデックス、配列)で呼び出されます。要素を保持するにはtrueを返し、そうでない場合はfalseを返します

説明だけが必要な場合。配列 filter() 名前の通り。条件が間違っている場合は、不要な要素を削除します(false)。

arr > 0|| isNaN(arr) === true

0,  false || false  //removed
1,  true || false  
2,  true || false
3,  true || false
'ate', false || true
'',   false|| false  // removed
false  false || false //removed

出力:

[1, 2, 3, "ate"]
0
Manwal