2013-03-29 100 views
0

在JavaScript(以及大多数其他编程语言)中,我已经注意到,在检查同一变量的多个coniditions并针对每个条件执行相同操作时,很难编写if-stats。在像这样的场景中,可以更简洁地编写if语句吗?更简洁地编写if语句

if(x==1|x==2|x==3){ //Is there any way to make this less verbose? 
    console.log("X equals either 1 or 2 or 3!"); 
} 

//this isn't syntactically correct, but it's more concise, 
//and I wish it were possible to write it more like this 
if(x==(1|2|3)){ 
    console.log("X equals either 1 or 2 or 3!"); 
} 
+0

这似乎是你的问题被用来作为一个精神的挑战,提供各种精心设计的答案。但我怀疑真正的答案是“不”。 – simon

+0

@simon不,我实际上想要找到一种方式来编写if语句,这样我就不需要编写大量冗余代码了。)使用正则表达式(如下面的答案中所示)将是一个解。 –

回答

3

你可以使用正则表达式:

if (/^(1|2|3)$/.test(x)) { ... } 
+1

从“表达或声明的简洁性:没有任何细节化和多余细节”(或者使用的字符数量)这个意义上来说,这很难“更简洁”。 – simon

+0

@vaugham您是否发现任何不适用于2位数的情况?它似乎在这个例子中工作,其中一个数字有2个数字:http://jsfiddle.net/JH6PQ/1/ –

2

您可以使用此:

if ([1, 2, 3].indexOf(x) >= 0) { ... } 

如果你需要平等的更复杂的测试,您可以定义自己的功能,使用它与内置的some()迭代器:

function match(value1, value2) { var result = . . .; return result; } 

if ([1, 2, 3].some(match.bind(null, x))) { . . . } 

bind出现在JS 1.8.5;如果您需要向后兼容性,可以使用:

if ([1, 2, 3].some(function(elt) {return match(x, elt);})) { . . . } 
1

根据我的经验,大部分的时间你可以让if语句只是定义了一个更简洁方法返回一个布尔值。您使代码更具可读性,更容易测试,也许您甚至会以这种方式重复使用更多代码。

当然其他答案也很方便。根据要求

一个例子:

if (password.length < 6 || ! /[0-9]/.test(password) || password == userName) { 
    alert('password doesn\'t meet security standards!'); 
} 

function isSecurePassword(pw, userName) { 
    if (password.length < 6) return false; 
    if (/[0-9]/.test(password)) return false; 
    if (password == userName) return false; 

    return true; 
} 

if (! isSecurePassword(pw, userName)) { 
    alert(..); 
} 

(通常你可能会有的对象和方法,就不必绕过变量)

+0

你有任何这样的方法的例子?我很想看到你找到的解决方案。 –

+0

@AndersonGreen我已经添加了一个例子:)是这样的,你想看到的东西,或者你对某些更具体的东西感兴趣? – stefreak

1

呀,我经常想知道如果使用相同的值多个if语句。

如果你有空闲时间,我会建议探索一些JS的函数式编程结构。您可能可以实现更优雅的解决方案。

我不能想出一个好的或者说我的头顶上的声明,但'AND'似乎是一个不聪明的人。

var Cond = { 
    'and': function(val, predicates) { 
     return predicates.every(function(predicate) { return predicate(val) }); 
    } 
} 

var predicates = [ 
    function(val) { return val > 40; } 
    function(val) { return val < 45; } 
    function(val) { return val === 42; } 
]; 

console.log(Cond.and(42, predicates)); 

我的例子是超级跛脚,但你应该很容易玩弄。