2017-07-20 2 views
0

Je suis curieux de savoir pourquoi l'autre si les déclarations dans la méthode du filtre ne retournent pas quoi que ce soit:Pourquoi les instructions if ne renvoient-elles pas les valeurs de type boolean et object?

var moveZeros = function (arr) { 
    const nonZeros = arr.filter(value => { 
    if (value !== 0) return value 
    else if (typeof value === 'boolean') return value 
    else if (typeof value === 'object') return value 
    }) 

    const zeros = arr.toString().match(/0/g).map(Number) 

    const newArr = nonZeros.concat(zeros) 

    return newArr 
} 

De plus, je voudrais aussi savoir pourquoi je reçois un effet similaire lorsque je tente de filtrer les zéros à partir d'un tableau:

const zeros = arr.filter(value => { 
    if (value === 0) return value 
}) 

Voici un tableau d'échantillons pour tester la fonction:

[ 0, 1, null, 2, false, 1, 0 ] 

Merci pour toute aide!

+0

Qu'est-ce que vous essayez faire? 'filter' attend un booléen, vous n'avez pas besoin de retourner la valeur – Psidom

+0

Le but de la fonction est de déplacer tous les zéros à la fin du tableau, tout en préservant l'ordre des autres éléments. C'est juste un exercice, mais je veux savoir pourquoi la méthode du filtre se comporte de cette façon. –

+0

parce que '0' est' falsey'. Donc quand vous faites 'return 0', c'est la même chose que' return false', ce qui veut dire que ça ne va pas être ajouté. – epascarello

Répondre

1

Vous n'avez pas besoin de retourner la valeur dans la méthode filter, le retour booléen qui devrait être vrai si la valeur doit être sélectionnée, comme suit:

var moveZeros = function (arr) { 
 
// also when you use !== 0, you don't need to check the type as it compares type 
 
    const nonZeros = arr.filter(value => value !== 0) 
 
    const zeros = arr.filter(value => value === 0) 
 

 
    const newArr = nonZeros.concat(zeros) 
 
    return newArr 
 
} 
 

 
console.log(moveZeros([ 0, 1, null, 2, false, 1, 0 ]));

+1

Merci! Cela a résolu le problème. –