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));
Was ich erwarte, ist, diesen Code auszuführen: true && true && false && false und das sollte false zurückgeben .
Wie macht man das in js? Vielen Dank
javascript
function
Hakim Asa
quelle
quelle
andMultipleExpr(1, 1, 0, 0)
oderandMultipleExpr(1, 1, 1, 1)
andMultipleExpr()
(Aufruf der Funktion ohne Parameter)?Antworten:
Verwenden Sie
Array.prototype.every
für alle übergebenen Argumente, um zu überprüfen, ob sie alle wahr sind.quelle
e => e === true
mitBoolean
true
.===
im OP-Code. Ihreevery
Idee ist jedoch genau richtig. Aber macht einfach.every(e => e)
den Job.const isTrue = x => x === true
(oderx => !!x
für alle wahrheitsgemäßen Werte), können Sie Ihre Lösung in komprimierenreturn arguments.every(isTrue)
. Was mir einfach wunderschön erscheint.Du brauchst
Beginnen Sie mit
logicalAnd
set totrue
Verwenden Sie diese
logicalAnd
Option, wenn Sie sie aktualisieren, anstatt zwei Einträge aus zu verwendenarguments
Die minimale Änderung ist:
Aber mbojko Lösung hat den Vorteil eines Kurzschlusses (Anhalten der Schleife , wenn es zuerst einen falsy Wert findet), die wie eine gute Idee zu sein scheint.
Da Sie ES2015 + verwenden, sollten Sie wahrscheinlich einen Rest-Parameter anstelle von verwenden
arguments
, und Sie können einefor-of
Schleife verwenden:Sie können dies auch im Einklang mit dem Ansatz von mbojko kurzschließen
Einige Leute mögen darauf werfen
reduce
, aber Archiesevery
Lösung ist viel besser. (Aber da Ihr Vergleich nicht streng ist, würde ich es einfach machen.every(flag => flag)
.)quelle
[].reduce((a,b)=>a && b)
Würfen niemals ohne Argumente aufgerufen wird .Frühe Rückgaben sollten den Code sowohl effizienter als auch kürzer machen:
quelle
Ich denke, dies ist ein sehr kurzer Weg mit ES6
Array.prototype.reduce
Weitere Erläuterungen zur Reduzierungsfunktion finden Sie unter MDN
quelle
every
wie Archie zu verwenden alsreduce
. Einfacher und es schließt kurz.every
zusome
. Noch einfacher. Immer noch Kurzschlüsse.Sie können
Array#every
den letzten Wert annehmen und zurückgeben.Dieser Ansatz gibt das tatsächliche Ergebnis des logischen UND zurück
&&
.Unter Verwendung des Ansatzes wird ein Kurzschluss für den zuerst gefundenen falschen Wert hergestellt. Dann stoppt die Iteration.
quelle
Vielleicht möchten Sie hören, was mit der Schleife schief gelaufen ist:
&&
letzten beiden Elemente, auf die sie stößt. Im Idealfall würden&&
die letzten beiden Elemente des Arrays zusammengefügt (was bereits nicht das ist, was Sie brauchen).i=arguments.length-1
überprüft es am Ende der Schleife das letzte Element des Arrays undi+1
ist das Element "nach" dem letzten Element, das istundefined
. In Bezug auf logische Beziehungen wird es berücksichtigtfalse
,&&
erzeugt aber in einem solchen Fall den Wert selbst, und deshalb gibt die Funktion dieundefined
ganze Zeit zurück (dies hätte in der Frage erwähnt werden können).Docs
Stattdessen sollten Sie
logicalAnd
als Akkumulator verwenden, der das Ergebnis&&
aller vorherigen Elemente sammelt. Ein Trick, den Sie verwenden können, ist, wenn das Ergebnis eines Teils&&
istfalse
, spielt es keine Rolle, was die verbleibenden Elemente sind, das Endergebnis wird seinfalse
, so dass die Schleife sofort anhalten kann:und dann können Sie es in Richtung Archies Antwort optimieren : Das Ergebnis von
&&
-ing Elementen ist,true
wenn alle Elemente vorhanden sindtrue
, und Sie müssen keine einzige&&
Operation ausführen, um das Ergebnis zu berechnen:(In den obigen Ausschnitten wollte ich
false
eine leere Argumentliste erstellen.)quelle