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));
Oczekuję wykonania tego kodu: true i& true i& false i& false, a to powinno zwrócić false .
Jak to zrobić w js? Dzięki
javascript
function
Hakim Asa
źródło
źródło
andMultipleExpr(1, 1, 0, 0)
lubandMultipleExpr(1, 1, 1, 1)
andMultipleExpr()
(Wywołanie funkcji bez parametrów)?Odpowiedzi:
Użyj
Array.prototype.every
wszystkich przekazanych argumentów, aby sprawdzić, czy wszystkie są prawdziwe;źródło
e => e === true
zBoolean
true
.===
w kodzie OP. Twójevery
pomysł jest jednak na miejscu . Ale po prostu.every(e => e)
działa.const isTrue = x => x === true
(lubx => !!x
dla wszystkich prawdziwych wartości), możesz skompresować swoje rozwiązaniereturn arguments.every(isTrue)
. Co wydaje mi się po prostu piękne.Musisz
Zacznij od
logicalAnd
ustawienia natrue
Użyj
logicalAnd
podczas aktualizacji, zamiast używać dwóch wpisów zarguments
Minimalna zmiana to:
Ale rozwiązanie mbojko ma tę zaletę, że powoduje zwarcie (zatrzymanie pętli, gdy po raz pierwszy znajdzie wartość fałsz), co wydaje się dobrym pomysłem.
Ponieważ używasz ES2015 +, prawdopodobnie powinieneś raczej użyć parametru rest
arguments
i możesz użyćfor-of
pętli:Możesz także zewrzeć to zgodnie z podejściem mbojko
Niektórzy mogą
reduce
na to rzucić , ale rozwiązanie Archiegoevery
jest znacznie lepsze. (Ale ponieważ twoje porównanie nie jest ścisłe, po prostu to zrobię.every(flag => flag)
.)źródło
[].reduce((a,b)=>a && b)
wyrzuca.Wczesne zwroty powinny uczynić kod zarówno bardziej wydajnym, jak i krótszym:
źródło
Myślę, że jest to bardzo krótka droga z użyciem ES6
Array.prototype.reduce
Aby uzyskać więcej informacji na temat funkcji zmniejszania, przeczytaj MDN
źródło
every
jak Archie zrobił niżreduce
. Prostsze i powoduje zwarcie.every
dosome
. Wciąż prostsze. Nadal występują zwarcia.Możesz wziąć
Array#every
i zwrócić ostatnią wartość.To podejście zwraca prawdziwy wynik logicznego AND
&&
.Przy zastosowaniu tego podejścia następuje zwarcie dla pierwszej znalezionej wartości falsy. Następnie iteracja się kończy.
źródło
Być może chcesz usłyszeć, co poszło nie tak z pętlą:
&&
dwa ostatnie napotkane elementy. W idealnym przypadku byłyby&&
to dwa ostatnie elementy tablicy (co już nie jest tym, czego potrzebujesz)i=arguments.length-1
sprawdzi ostatni element tablicy ii+1
będzie to element „po” ostatniego, czyliundefined
. Pod względem relacji logicznych jest to rozważanefalse
, ale&&
w takim przypadku sama wytwarza wartość, i dlatego funkcja zwracaundefined
cały czas (można o tym wspomnieć w pytaniu).Dokumenty
Zamiast tego powinieneś użyć
logicalAnd
jako akumulatora, który zbiera wynik&&
-stosowania wszystkich poprzednich elementów, a sztuczką, którą możesz zastosować, jest to, że jeśli wynikiem częściowego&&
jestfalse
, nie ma znaczenia, jakie są pozostałe elementy, wynik końcowy będziefalse
, więc pętla może się natychmiast zatrzymać:a następnie możesz zoptymalizować go w kierunku odpowiedzi Archiego : wynikiem
&&
-ing elementów jest,true
jeśli wszystkie sątrue
, i nie musisz wykonywać żadnej&&
operacji w celu obliczenia wyniku:(W powyższych fragmentach chciałem
false
stworzyć pustą listę argumentów.)źródło