if子句中的多个条件

时间:2015-08-06 12:12:04

标签: javascript if-statement

如果我的if语句需要满足这些要求:

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

有没有办法说所有这些都大于零?只是为了更有效的DRY代码?

类似的东西:

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

9 个答案:

答案 0 :(得分:47)

您可以使用Math.min获得最低值,然后只需要对下限进行一次检查。

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

答案 1 :(得分:34)

您可以使用.every的数组。这不是干,但更详细:

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

我喜欢这个的原因是通过使用数组,你会发现每个变量都在重复逻辑。以明显的方式命名回调有助于未来读者准确理解该检查将实现什么。最后,这不仅为数字提供了范围,而且还为未来的任何类型提供了任何检查 - 任何复杂性都隐藏在if语句本身之外。

答案 2 :(得分:29)

正如有些人所说,在if语句中有多个简单条件并没有错,但我会考虑将格式更改为:

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

或者我会将使用这些变量作为整数更改为bool变量,即isCavehasTraining或类似变量,然后将正确的bool设置为更靠近代码定义不同属性的位置(编辑:如果错误则可能提前返回,以防止进一步的不必要的计算)。这将在下一个代码块中简化你对if语句的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语句中的多个条件不是你最大的代码味道,我会把注意力转移到给你的变量更好的名字,清楚地表明值表示什么。这样可以提高对代码的阅读和理解,比一些奇怪的语法更能避免多条if条件。

答案 3 :(得分:8)

if语句中使用多个简单条件没有任何问题。但是,如果它不能放入一行(大约80个字符),那么您可以使用一些解决方案。

最终,您不会检查四个变量是否大于零。您正在检查一组条件。由有符号整数表示的这些条件(当前)这一事实不仅无关紧要,而且是应隐藏在函数中的实现细节。

  1. 使用中间标志:

    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)
        // ...
    
  2. 使用功能:

    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())
        // ...
    
  3. 根据您需要检查的具体条件使用函数:

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

答案 4 :(得分:4)

假设32位整数。

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))

答案 5 :(得分:4)

听起来像是一个“验证器”功能的工作:

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)) {
    // ...
}

答案 6 :(得分:4)

正如其他人所建议的那样,如果你不介意使用ES6或polyfill,你可以使用.every:

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,可以使用reduce:

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

if (hasAllStats) { }

答案 7 :(得分:2)

使用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安装程序是否更快。

答案 8 :(得分:1)

为什么要寻找解决方案?

  

你的问题看起来像是最简单的答案,我推荐它。我们有多种解决方案。下面是一个。

JSBin for .every()

使用.every函数

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

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