Подтвердить что ты не робот

Несколько условий в условии if

Если у меня есть оператор if, который должен соответствовать этим требованиям:

if(cave > 0 && training > 0 && mobility > 0 && sleep > 0)

Можно ли сказать, что все они больше нуля? Только для более эффективного СУХОГО кода?

Что-то вроде:

if(cave, training, mobility, sleep > 0)
4b9b3361

Ответ 1

Вы можете получить самое низкое значение с Math.min, а затем вам нужна только одна проверка против нижней границы.

if(Math.min(cave, training, mobility, sleep) > 0) {
    //do something
}

Ответ 2

Вы можете использовать массив с .every. Это меньше СУХОЙ, но более подробный:

var isGreaterThanZero = function(val) {
    return val > 0;
};
if([cave, training, mobility, sleep].every(isGreaterThanZero)) {
    // Do Something
}

Причина, по которой мне нравится, заключается в том, что, используя массив, становится очевидным, что вы повторяете логику для каждой переменной. Именование обратного вызова очевидным образом помогает будущим читателям точно понять, что будет делать эта проверка. И, наконец, это дает возможность не только числам, но и любой проверке любого типа в будущем - с любой сложностью, скрытой от самого оператора if.

Ответ 3

Как утверждают некоторые, нет ничего плохого в том, что в инструкции if имеется несколько простых условий, однако я бы подумал об изменении форматирования на:

if ( cave > 0
   && training > 0
   && mobility > 0
   && sleep > 0 )

В качестве альтернативы я бы изменил это значение от использования этих переменных в виде целых чисел, в переменные bool, то есть isCave, hasTraining или аналогичные, а затем установил правильный bool ближе к тому, где ваш код определяет различные свойства (Edit: And возможно, вернуться раньше, если это неверно, чтобы предотвратить дальнейшие ненужные вычисления). Это упростило бы ваш оператор if последнему в следующем блоке кода, который дополнительно показывает вариант, который можно использовать, если условия становятся немного более сложными или вы хотите облегчить чтение инструкции if:

var isCave =  cave > 0; # What does cave > 0 mean?
var hasTraining = training > 0;
var isMobile = mobility > 0;
var isNotSleeping = sleep > 0; # What does sleep > 0 indicate? Unclear

if (isCave && hasTraining && isMobile && isNotSleeping ) {
   // Do your thing
}

Другими словами, множественные условия в вашем выражении if не являются вашим самым большим запахом кода, я бы переключил свое внимание на то, чтобы дать вашим переменным лучшие имена, четко указывающие, что указывает значение. Это улучшит чтение и понимание вашего кода, а не какой-то странный синтаксис, чтобы избежать множественных условий.

Ответ 4

Нет ничего плохого в том, что в инструкции if есть несколько простых условий. Однако, если он не может вписаться в одну строку (около 80 символов), у вас есть несколько решений.

В конечном счете вы не проверяете, больше ли четыре переменных, чем ноль. Вы проверяете набор условий. Тот факт, что эти условия (в настоящее время) представлены целыми числами со знаком, не только не имеет значения, но и детали реализации, которые должны быть скрыты в функциях.

  • Использовать флаги-посредники:

    var valid_location = false;
    if (cave > 0 && training > 0)
        valid_location = true;
    
    var valid_status = false;
    if (mobility > 0 && sleep > 0)
        valid_status = true;
    
    if (valid_location && valid_status)
        // ...
    
  • Используйте функцию:

    function can_do_this()
    {
        // split conditions into logical groups
    
        // checking location, because you need training if you're
        // in a cave
        if (cave <= 0 || training <= 0)
            return false;
    
        // checking status, because you have to be mobile and
        // sleepy
        if (mobility <= 0 || sleep <= 0)
            return false;
    
        return true;
    }
    
    if (can_do_this())
        // ...
    
  • Используйте функции для отдельных условий, которые необходимо проверить:

    function valid_location()
    {
        return (cave > 0 && training > 0);
    }
    
    function valid_status()
    {
        return (mobility > 0 && sleep > 0);
    }
    
    if (valid_location() && valid_status())
        // ...
    

Ответ 5

Предполагая 32-битные ints.

if ((cave | training | mobility | sleep) > 0)

Если какой-либо из вышеуказанных чисел отрицательный, результат OR будет отрицательным и требования не будут выполнены.

Изменить: он не работает, если один из параметров равен 0. Это будет работать, но это будет не так эффективно и легко читать, как другие способы.

if (((cave | training | mobility | sleep) > 0) && (cave*training*mobility*sleep != 0)) 

Еще одно лучшее исправление

if (!((cave | training | mobility | sleep) < 0))

Ответ 6

Звучит как задание для функции "validator":

function areAllGreaterThanZero(){
    //TODO: check inputs
    var result = true;
    [].splice.apply(arguments).forEach(function(x){ 
        result = result && (x > 0); 
    });
    return result;
}

if(areAllGreaterThanZero(cave, training, mobility, sleep)) {
    // ...
}

Ответ 7

Как и другие, вы можете использовать .every, если вы не против использования ES6 или polyfills:

var hasAllStats = [cave, training, mobility, sleep]
  .every(function(stat) { return stat > 0; });

if (hasAllStats) { }

В качестве альтернативы вы можете использовать .some для получения обратного (также требуется ES6 или polyfill):

var isMissingStats = [cave, training, mobility, sleep]
  .some(function(stat) { return stat <= 0; });

if (!isMissingStats) { }

Если вы не хотите использовать ES6, вы можете использовать сокращение:

var hasAllStats = [cave, training, mobility, sleep]
  .reduce(function(hasAllStats, stat) {
    return hasAllStats && stat > 0;
  }, true);

if (hasAllStats) { }

Ответ 8

Отфильтровать его с помощью lodash:

var data = [cave, training, mobility, sleep];
var result = _.filter(data, function (datum) { return datum > 0; }).length === data.length;

console.log(result);

Он выполняет итерацию по элементам массива и возвращает новый массив, состоящий из тех элементов, которые соответствуют заданному требованию > 0 - если массив результатов отличается от заданного, то один или несколько из них не были > 0.

Я написал его специально для проверки каждого значения массива (даже если это не обязательно, поскольку первый > 0 мог дать тот же результат), чтобы не останавливаться на первом положительном, поскольку вы заявили, что хотите проверить все из них.

PS Вы можете отменить его, чтобы проверить <= 0 и проверить на .length === 0 instaed, чтобы быть быстрее.

Ответ 9

Почему вы ищете решение?

Ваш вопрос выглядит как лучший и простой ответ, я рекомендую его. Для этого у нас есть несколько решений. Ниже - это.

JSBin для .every()

Достичь этого, используя . каждая функция

var flag = [cave, training, mobility, sleep].every(function(val) {
     return val > 0;
  });

if(flag) {
  alert('All the elements are greater than Zero');
}