web-dev-qa-db-fra.com

javascript .filter () true booleans

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]);

Je ne dois renvoyer que de vraies instructions booléennes, et lorsque je lance ce code, cela fonctionne. Cependant, je suis assez confus parce que mon "if statement" fonctionnera que ce soit b! == vrai ou b! == faux. Quelqu'un pourrait-il s'il vous plaît expliquer la raison pour laquelle cela fonctionne dans les deux sens?

9
jyoon006

Je résolvais un problème similaire et suis venu avec ceci: 

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

manière la plus simple de le faire:

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

C'est parce que vous retournez la valeur. La fonction de filtrage doit retourner true ou false comme ceci:

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

ou plus court:

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

Votre fonction agit si les valeurs JavaScript dans les comparaisons booléennes sont "vérité" ou "falsey". Les non-booléens sont contraints à une valeur booléenne lorsqu'ils sont utilisés dans un contexte booléen (comparaisons, si déclarations, etc.) 

Si je comprends votre intention, vous pouvez modifier votre fonction pour obtenir le résultat attendu de la manière suivante: 

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

Apparemment, .filter a été introduit dans ES5. Cela m'a définitivement aidé à comprendre ce qui se passe ici. J'espère que ça aide!

Essentiellement, écrire

arr.filter(Boolean)

est la même chose que l'écriture

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

puisque Boolean est aussi une fonction qui renvoie la vérité quand elle est vraie et la fausseté quand elle est fausse

Source: ici .

0
leonel.ai