function andMultipleExpr(){
let logicalAnd;
let i;
for (i = 0; i < arguments.length; i++){
logicalAnd = arguments[i] && arguments[i+1];
}
return logicalAnd;
}
console.log(andMultipleExpr(true, true, false, false));
Ce que j'attends, c'est d'exécuter ce code: true && true && false && false et cela devrait retourner false .
Comment faire fonctionner ça en js? Merci
javascript
function
Hakim Asa
la source
la source
andMultipleExpr(1, 1, 0, 0)
ouandMultipleExpr(1, 1, 1, 1)
andMultipleExpr()
(Appel de la fonction sans paramètres)?Réponses:
Utilisez
Array.prototype.every
tous les arguments passés pour vérifier s'ils sont tous vrais;la source
e => e === true
parBoolean
true
.===
dans le code OP. Mais votreevery
idée est parfaite . Mais fait juste.every(e => e)
le travail.const isTrue = x => x === true
(oux => !!x
pour toutes les valeurs véridiques), vous pouvez compresser votre solution dansreturn arguments.every(isTrue)
. Ce qui me semble tout simplement magnifique.Tu dois
Commencez par
logicalAnd
définir surtrue
À utiliser
logicalAnd
lors de la mise à jour, plutôt que d'utiliser deux entrées dearguments
Le changement minimal est:
Mais la solution de mbojko a l'avantage de court-circuiter (arrêter la boucle lorsqu'elle trouve une valeur falsifiée pour la première fois), ce qui semble être une bonne idée.
Puisque vous utilisez ES2015 +, vous devriez probablement utiliser un paramètre de repos plutôt que
arguments
, et vous pouvez utiliser unefor-of
boucle:Vous pouvez également court-circuiter cela conformément à l'approche de mbojko
Certaines personnes pourraient y jeter un coup
reduce
d'œil, mais laevery
solution d'Archie est bien meilleure. (Mais comme votre comparaison n'est pas stricte, je le ferais.every(flag => flag)
.)la source
[].reduce((a,b)=>a && b)
throws.Les retours anticipés devraient rendre le code à la fois plus efficace et plus court:
la source
Je pense que c'est un moyen très court d' utiliser ES6
Array.prototype.reduce
Pour plus d'explications sur la fonction de réduction, veuillez lire MDN
la source
every
comme Archie a fait quereduce
. Plus simple, et ça court-circuite.every
poursome
. Encore plus simple. Toujours des courts-circuits.Vous pouvez prendre
Array#every
et renvoyer la dernière valeur.Cette approche renvoie le résultat réel d'un ET logique
&&
.En utilisant l'approche, un court-circuit est effectué pour la première valeur de falsification trouvée. Ensuite, l'itération s'arrête.
la source
Peut-être que vous voulez entendre ce qui a mal tourné avec la boucle:
&&
deux derniers éléments rencontrés. Dans le cas idéal, il&&
regrouperait les deux derniers éléments du tableau (ce qui n'est déjà pas ce dont vous avez besoin)i=arguments.length-1
, il vérifiera le dernier élément du tableau, eti+1
est l'élément "après" le dernier, qui estundefined
. En termes de relations logiques, il est considéréfalse
, mais&&
produit la valeur elle-même dans ce cas, et c'est pourquoi la fonction revientundefined
tout le temps (cela aurait pu être mentionné que dans la question).Documents
Au lieu de cela, vous devez utiliser
logicalAnd
comme accumulateur, qui recueille le résultat de&&
-ing tous les éléments précédents, et une astuce que vous pouvez utiliser est que si le résultat d'un partiel&&
estfalse
, peu importe ce que sont les éléments restants, le résultat final va êtrefalse
, donc la boucle peut s'arrêter immédiatement:et ensuite vous pouvez l'optimiser vers la réponse d'Archie : le résultat des
&&
éléments -ing esttrue
si tous les éléments le sonttrue
, et vous n'avez pas à exécuter une seule&&
opération pour calculer le résultat:(Dans les extraits ci-dessus, je visais à produire
false
une liste d'arguments vide.)la source