2017-05-14 5 views
1

Je dois supprimer toutes les valeurs vides (null, indéfini, '', NaN, faux) SAUF 0 à partir d'un tableau. Par exemple: [0, false, [], undefined, {}, NaN, 'Kevin'] => [0, [], {}, 'Kevin'];code conçu pour retirer NaN du tableau, retourne toujours NaN JS

function removeBlank(array) { 
    array = array.filter(function (n) { 
    return (n !== undefined && n !== null && n !== false && n !== "" && isNaN()!= NaN); }); 
    console.log(array); 
} 

Cependant, cela renvoie toujours un NaN. par exemple removeBlank([0, NaN, undefined, false, '', null, 'Kevin']); retours [0, NaN, "Kevin"]

Comment puis-je améliorer la isNaN()! = NaN) pour éliminer NaN avec la suppression des chaînes, ZEROS ou d'autres chiffres?

Répondre

1

isNaN()!= NaN n'a pas de sens, isNaN est une fonction qui prend un paramètre et contrôle (retour true ou false) si elle est un numéro valide ou non, vous n'êtes pas lui passer quoi que ce soit.

Et même si vous l'utilisez correctement, cela ne fonctionnera pas, car alors toutes les valeurs qui ne sont pas des nombres seront filtrées.

Je suggère d'utiliser ceci:

array = array.filter(function (n) { 
    return n || n === 0; 
}); 

soit n est truthy ou il est 0.

+0

@MaxES 'OR logique, cela signifie que les deux côtés sont' true' ou véridiques. Si 'n! == false! ==" "! == 0! == NaN! == undefined! == null' alors c'est vrai et alors' n' est équivalent à 'true' donc le test est ok. Si 'n === 0' alors le côté gauche de' || 'sera équivalent à' false', mais le côté droit 'n === 0' sera' true', '||' ne nécessitera qu'un ' vrai côté à être «vrai». Donc, soit 'n' est vrai ou il est égal à' 0'. –

+0

@MaxES Voici plus sur [** opérateurs logiques **] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators). –

+0

Si c'est 'Infinity' ou '-Infinity', il retournera' true'. Habituellement, c'est une mauvaise idée de travailler avec des nombres infinis, presque aucune application ne les traite. – arboreal84

0

isNaN prend le nombre comme paramètre. A besoin d'être isNaN(n)

Alors, à moins que vous voulez travailler avec un nombre infini, comme -Infinity et Infinity, je vous recommande de simplement valider avec:

arr.filter(function (n) { 
    return isFinite(n); 
}); 

NaN n'est pas fini donc il serait filtré aussi. NaN a également la propriété que toute comparaison le fera retourner false. Cela signifie que n == n renverra false si n est NaN.

+0

'Infinity' devrait être véridique. J'imagine. –

+0

'Infinity' n'est pas un nombre que vous pouvez utiliser avec d'autres nombres que pour les besoins de la comparaison. En ce sens, «Infinity» rompt presque toujours la logique métier. – arboreal84