web-dev-qa-db-fra.com

Supprimer toutes les valeurs de fausseté d'un tableau

Je voudrais supprimer toutes les valeurs fausses d'un tableau. Les valeurs fausses en JavaScript sont false, null, 0, "", indéfini et 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], "");

Ce qui précède est satisfait pour tous sauf le cas de test NaN. Quelqu'un peut-il m'aider à vérifier dans le tableau s'il contient ou non NaN?

42
Vignesh

Vous pouvez utiliser Boolean:

var myFilterArray = myArray.filter(Boolean);
92
LoremIpsum

Puisque vous voulez vous débarrasser des valeurs "fausses", laissez simplement JavaScript faire son travail:

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

La double application de l'opérateur ! fera en sorte que le rappel de filtre renvoie true lorsque la valeur est "vérité" et false lorsqu'il est "falsy".

(Votre code appelle isNaN() mais ne lui transmet pas de valeur; c'est pourquoi ce test n'a pas fonctionné. La fonction isNaN() renvoie true si son paramètre, lorsqu'il est contraint de passer à un nombre, est NaN et false sinon.)

edit - notez que

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

loremIpsum le notera également dans une autre réponse, car le constructeur booléen intégré fait à peu près exactement la même chose que !!.

50
Pointy
truthyArray = arr.filter(el => el)

^ c'est comme ça que vous le faites

18
J__

Vous utilisez isNaN() de manière incorrecte. Ce devrait être quelque chose comme suit:

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

}

Aussi, vous pouvez le réécrire:

function bouncer( arr ){
    return arr.filter( function( value ){
        return value;
    });
}
9
ioncreature

Je sais que cela peut être fait en utilisant la méthode arr.filter (). Mais je préfère utiliser la fonction Boolean (). Est plus clair pour moi. Voici comment je l'ai fait, bien qu'un peu plus longtemps:

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.
3
Lawrence Oputa

Ceci est une autre solution équivalente mais illustrative:

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

Cet exemple de code est illustratif car il indique au lecteur que la variable value sera évaluée en tant que vérité ou falsey et que la fonction anonyme renverra un booléen, true ou false, mappant à l'évaluation de value.

Pour ceux qui ne sont pas familiers avec cette approche consistant à supprimer des valeurs d'un tableau basé sur leur véracité, ou pour ceux qui ne connaissent pas (ou n'ont pas lu la documentation sur) la fonction filter, cet exemple est le plus concis qui soit encore transmis. le comportement de la fonction filter.

Bien entendu, dans votre application, vous pouvez opter pour la mise en œuvre plus concise, mais moins perspicace:

function bouncer( arr ){
    return arr.filter( function( value ){
        return value;
    });
}
3
sealocal

fonction videur:

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

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

2
Jalal Azimi

Je pense une meilleure affaire de cette façon

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

    bouncer([7, "ate", "", false, 9, NaN, undefined, 0]);
2
Kirill Kotlyarov

Merci pour toutes les réponses de travail ci-dessus. Voici 3 approches pour résoudre le problème. Troisième solution au problème par votre approche @Vignesh.

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;
    });
 }
2
Raj

C'est mon idée ...

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

1
Geo4you

En utilisant un filtre, nous pouvons écrire 

function bouncer(arr) {
 return arr.filter(item => item);
}
bouncer([false, null, 0, NaN, undefined, ""]) // will return [].
1
chhitij srivastava

lodash peut faire l'affaire, il existe une fonction _.compact ().

const arr = [7, "ate", "", false, 9, NaN];
console.log(_.compact(arr));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

0
Yi-Ting Liu
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
pavelsal
function falsy(value) {
      if (value) {
        return value;
      }
    }

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

    bouncer([7, "ate", "", false, 9]);
0
Kōdo no musō-ka

Cela devrait être ce que vous recherchez:

let array = [7, 'ate', '', false, 9, NaN];

function removeFalsyItems(array) {
   // Your result
   let filter = array.filter(Boolean);

   // Empty the array
   array.splice(0, array.length);

   // Push all items from the result to our array
   Array.prototype.Push.apply(array, filter);

   return array
}

removeFalsyItems(array) // => [7, 'ate', 9], funny joke btw...
0
Lapys

Essayez d’utiliser un filtre et un booléen:

let array = [7,"ate","",false,9];
array.filter((values) => {return Boolean(values) === true })
0
Luvdeep Katyal
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
Andriy Polukhin
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]);
0
anonymous user