web-dev-qa-db-ja.com

javascript .filter()trueブール値

function bouncer(arr) {
  // Don't show a false ID to this bouncer.
    function a(b) {
      if(b !== false) {
        return b;
      }
    }

    arr = arr.filter(a);
    return arr;
}

bouncer([7, 'ate', '', false, 9]);

私は真のブール文のみを返す必要があり、このコードを実行すると機能します。ただし、「ifステートメント」はb!== trueでもb!== falseでも機能するため、かなり混乱しています。これが両方の方法で機能する理由を誰かが説明できますか?

17
jyoon006

私は同様の問題を解決していて、これを思いつきました:

function bouncer(arr) {
  return arr.filter(Boolean);
}
bouncer([7, 'ate', '', false, 9]);
// returns ['7','ate','9']
38
hello world

どうやら 。filter() はES5で導入されました。

これは間違いなく、ここで起こっていることに私の心を包むのに役立ちました。それが役に立てば幸い!

基本的に、書くこと:

arr.filter(Boolean)

書くことと同じです:

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

Boolean() は、trueのときに真を、falseのときに偽を返す関数でもあるためです。

例:

var a = [1, 2, "b", 0, {}, "", NaN, 3, undefined, null, 5];

var b = a.filter(Boolean);  // [1, 2, "b", {}, 3, 5]; 

出典: ここ

9
leonel.ai

それを行う最も簡単な方法:

function bouncer(arr) {
    return arr.filter(x => !!x);
}
6
mahig

値を返すからです。フィルター関数は、次のようにtrueまたはfalseを返します。

function bouncer(arr) {
    arr = arr.filter(function(x) { console.log(x === true)
       if(x !== false) {
           return true;
       }
    });
    return arr;
}

以下:

function bouncer(arr) {
    return arr.filter(function(x) { console.log(x === true)
       return x !== false;
    });
}
3
Emil Ingerslev

ブール比較のJavaScript値が「真実」または「偽」であるため、関数が機能します。非ブール値は、ブール値のコンテキスト(比較、ifステートメントなど)で使用されると、ブール値に強制変換されます。

私があなたの意図を理解している場合は、次のように関数を変更して期待される出力を得ることができます。

function bouncer(arr) {
  // Don't show a false ID to this bouncer.
    function a(b) {
      if(typeof(b) === 'boolean' && !b) {
        return new Boolean(b);
      }
    }

    arr = arr.filter(a);
    return arr;
}

bouncer([7, 'ate', '', false, 9, true]);
1
jdphenix