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));
Я ожидаю выполнения этого кода: true && true && false && false, и это должно вернуть false .
Как заставить это работать в JS? Спасибо
javascript
function
Хаким Аса
источник
источник
andMultipleExpr(1, 1, 0, 0)
илиandMultipleExpr(1, 1, 1, 1)
andMultipleExpr()
(вызов функции без параметров)?Ответы:
Используйте
Array.prototype.every
все переданные аргументы, чтобы проверить, все ли они истинны;источник
e => e === true
наBoolean
true
.===
в коде ОП. Вашаevery
идея , однако, на месте . Но просто.every(e => e)
делает свою работу.const isTrue = x => x === true
(илиx => !!x
для всех истинных значений), вы можете сжать свое решение вreturn arguments.every(isTrue)
. Который мне кажется просто красивым.Тебе следует
Начните с
logicalAnd
набораtrue
Использовать
logicalAnd
при обновлении, а не использовать две записи изarguments
Минимальное изменение:
Но у решения mbojko есть преимущество короткого замыкания (остановка цикла, когда он впервые находит ложное значение), что кажется хорошей идеей.
Поскольку вы используете ES2015 +, вам, вероятно, следует использовать параметр rest, а не
arguments
, и вы можете использоватьfor-of
цикл:Вы также можете замкнуть, что в соответствии с подходом Мбойко
Некоторые люди могут бросить
reduce
это, но решение Арчиevery
намного лучше. (Но поскольку ваше сравнение не является строгим, я бы просто сделал это.every(flag => flag)
.)источник
[].reduce((a,b)=>a && b)
throws.Ранний возврат должен сделать код более эффективным и более коротким:
источник
Я думаю, что это очень короткий путь с использованием ES6
Array.prototype.reduce
Для получения более подробной информации о функции снижения, пожалуйста, прочитайте MDN
источник
every
как Арчи сделал чемreduce
. Проще, и это короткие замыкания.every
кsome
. Все еще проще. Все еще короткие замыкания.Вы можете взять
Array#every
и вернуть последнее значение.Такой подход возвращает реальный результат логического И
&&
.Используя этот подход, создается короткое замыкание для первого найденного ложного значения. Затем итерация останавливается.
источник
Возможно, вы хотите услышать, что пошло не так с циклом:
&&
последние два элемента, с которыми он сталкивается. В идеальном случае это были бы&&
вместе два последних элемента массива (что уже не то, что вам нужно)i=arguments.length-1
он проверяет последний элемент массива иi+1
является элементом «после» последнего, то естьundefined
. С точки зрения логических отношений это рассматриваетсяfalse
, но в этом случае&&
создает само значение, и поэтому функция возвращаетundefined
все время (это можно было упомянуть в вопросе).Документы
Вместо этого, вы должны использовать в
logicalAnd
качестве аккумулятора, который собирает результат&&
-ную все предыдущие элементы, и хитрость , что вы можете использовать, если в результате частичного&&
являетсяfalse
, это не имеет значения , что остальные элементы, конечный результат будетfalse
, поэтому цикл может немедленно остановиться:и затем вы можете оптимизировать его в соответствии с ответом Арчи : результат
&&
-ing элементов - этоtrue
если все элементы естьtrue
, и вам не нужно выполнять одну&&
операцию для вычисления результата:(В приведенных выше фрагментах я стремился
false
создать пустой список аргументов.)источник