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));
Lo que espero es ejecutar este código: verdadero && verdadero && false && false y eso debería devolver falso .
¿Cómo hacer que eso funcione en js? Gracias
javascript
function
Hakim Asa
fuente
fuente
andMultipleExpr(1, 1, 0, 0)
oandMultipleExpr(1, 1, 1, 1)
andMultipleExpr()
(Llamar a la función sin parámetros)?Respuestas:
Use
Array.prototype.every
en todos los argumentos pasados para verificar si todos son verdaderos;fuente
e => e === true
conBoolean
true
.===
en el código del OP. Sin embargo, suevery
idea es acertada . Pero solo.every(e => e)
hace el trabajo.const isTrue = x => x === true
(ox => !!x
para todos los valores de verdad), puede comprimir su soluciónreturn arguments.every(isTrue)
. Lo que me parece simplemente hermoso.Necesitas
Comience con
logicalAnd
establecer entrue
Úselo
logicalAnd
al actualizarlo, en lugar de utilizar dos entradas dearguments
El cambio mínimo es:
Pero la solución de mbojko tiene la ventaja de provocar un cortocircuito (detener el ciclo cuando encuentra por primera vez un valor falso), lo que parece una buena idea.
Dado que está utilizando ES2015 +, probablemente debería usar un parámetro rest en lugar de
arguments
, y puede usar unfor-of
bucle:También puede cortocircuitar eso de acuerdo con el enfoque de mbojko
Algunas personas podrían lanzarse
reduce
a esto, pero laevery
solución de Archie es mucho mejor. (Pero como su comparación no es estricta, simplemente lo haría.every(flag => flag)
).fuente
[].reduce((a,b)=>a && b)
arroja.Los retornos tempranos deberían hacer que el código sea más eficiente y más corto:
fuente
Creo que este es un camino muy corto usando ES6
Array.prototype.reduce
Para obtener más explicaciones sobre la función de reducción, lea MDN
fuente
every
como Archie hizo quereduce
. Más simple, y cortocircuitos.every
asome
. Aún más simple. Todavía cortocircuitos.Puede tomar
Array#every
y devolver el último valor.Este enfoque devuelve el resultado real de AND lógico
&&
.Al utilizar el enfoque, se crea un cortocircuito para el primer valor falso encontrado. Entonces la iteración se detiene.
fuente
Quizás quieras escuchar qué salió mal con el bucle:
&&
dos últimos elementos que encuentra. En el caso ideal, reuniría&&
los dos últimos elementos de la matriz (que ya no es lo que necesita)i=arguments.length-1
, verificará el último elemento de la matriz, yi+1
es el elemento "después" del último, que esundefined
. En términos de relaciones lógicas, se considerafalse
, pero&&
produce el valor en sí mismo en ese caso, y es por eso que la función regresaundefined
todo el tiempo (esto podría haber sido mencionado en la pregunta).Docs
En cambio, debe usarlo
logicalAnd
como un acumulador, que recoge el resultado de&&
-ing todos los elementos anteriores, y un truco que puede usar es que si el resultado de un parcial&&
esfalse
, no importa cuáles sean los elementos restantes, el resultado final va a serfalse
así que el ciclo puede detenerse de inmediato:y luego puede optimizarlo hacia la respuesta de Archie : el resultado de
&&
-ing items estrue
si todos los ítems sontrue
, y no tiene que ejecutar una sola&&
operación para calcular el resultado:(En los fragmentos anteriores, pretendía producir
false
una lista de argumentos vacía).fuente