如果我的if语句需要满足这些要求:
if(cave > 0 && training > 0 && mobility > 0 && sleep > 0)
有没有办法说所有这些都大于零?只是为了更有效的DRY代码?
类似的东西:
if(cave, training, mobility, sleep > 0)
答案 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变量,即isCave
,hasTraining
或类似变量,然后将正确的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个字符),那么您可以使用一些解决方案。
最终,您不会检查四个变量是否大于零。您正在检查一组条件。由有符号整数表示的这些条件(当前)这一事实不仅无关紧要,而且是应隐藏在函数中的实现细节。
使用中间标志:
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())
// ...
答案 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)
为什么要寻找解决方案?
你的问题看起来像是最简单的答案,我推荐它。我们有多种解决方案。下面是一个。
使用.every函数
实现它var flag = [cave, training, mobility, sleep].every(function(val) {
return val > 0;
});
if(flag) {
alert('All the elements are greater than Zero');
}