在IF中优化OR

我有这样的代码:

if (action == 'John' || action == 'John Beckham' || action == 'Henry John'){ alert('true!'); } 

如何最小化此代码?

应该在IE7中工作。

如果“John”总是出现,最简单的事情是:

 if (action.toLowerCase().indexOf("john") !== -1) { // Do something } 

…但是,由于你的问题已经改变了你曾经检查过一次action的价值,我犹豫不决。 另请注意,它将匹配“xxxjohnxxx”,这可能不是您想要的。

原始建议(针对您的修改中的新action值进行了更新):


有许多方法,所有都使用灵敏度案例显示因为你在评论中提到:

String#indexOf

 if ("|john|john beckham|john henry|giggs john|scholes john|john messi|".indexOf("|" + action.toLowerCase() + "|") !== -1) { // Do something } 

常用表达:

 if (/^(?:John|John Beckham|John Henry|Giggs John|Scholes John|John Messi)$/i.test(action)) { // Do something } 

因为你只是使用了true / false结果,所以我使用的是只返回true / false的test ,而不是返回匹配结果的exec 。 两者都适用于这种情况,但浏览器可能会稍微优化test (但是,如果您的目标是最快的结果或最少的内存使用,则正则表达式不太可能是最佳解决方案)。


或者一个switch

 switch (action.toLowerCase()) { case "john": case "john beckham": case "john henry": case "giggs john": case "scholes john": case "john messi": // Do something } 

或者对象查找:

 var actions = { "john": true, "john beckham": true, "john henry": true, "giggs john": true, "scholes john": true, "john messi": true }; if (actions[action.toLowerCase()]) { // do something } 

(这也有让你说要做什么的优点 – 例如, true可以用你调用的函数替换。)


或者(在启用ES5的环境中或使用ES5填充程序) Array#indexOf

 if (["john", "john beckham", "john henry", "giggs john", "scholes john", "john messi"].indexOf(action.toLowerCase()) !== -1 { // Do something } 

或者因为你使用jQuery,你可以通过使用inArray避免旧版浏览器上的垫片:

 if ($.inArray(action.toLowerCase(), ["john", "john beckham", "john henry", "giggs john", "scholes john", "john messi"]) !== -1) { // Do something } 

如果使用jquery,那么你可以这样做:

 var arr = ['a','b','c','d','e','f','g']; if( $.inArray(action, arr) !== -1 ) { alert("true"); } 

试试这个,它使用indexOf :

 if (['a', 'b', 'c', 'd', 'e'].indexOf(action) > -1) { alert(true); } 

更新:如果您想支持IE7及更低版本,请使用此问题的答案

如果你正在使用jQuery,你可以像这样使用$.inArray

 if ($.inArray(action, ['a','b','c','d') > -1) { alert(true); } 

UPDATE

您还可以使用带有test的正则表达式(该组使正则表达式与"John Langhammerer"不匹配/具有额外字符的操作与要匹配的字符串):

 if ((/^(John Langhammer|Piet Krauthammer|Some Guy)$/i).test(action)) { alert(true); } 

更新/i使regexp不区分大小写。

下面是一个适用于one-char操作的解决方案:

您也可以使用IE7支持的String.indexOf (如果您的操作都是一个char):

 if ('abcde'.indexOf(action) > -1) { alert(true); } 

制作如下数组。

 var newAry = array('a','b','c'); 

现在只需检查如下。

 $(function() { var newAry = Array('a','b','c'); if($.inArray(action,newAry)){ alert(action); } }); 

跨浏览器解决方案:

 if ( action in {'John':1, 'John Beckham':1, 'John Henry':1, 'Giggs John':1, 'Scholes John':1, 'John Messi':1 } ){ alert('true!'); } 

除了indexOf ,您还可以在Javascript中使用条件运算符。

 names = ['John' , 'John Beckham', 'John Henry' , 'Giggs John' , 'Scholes John', 'John Messi' ]; names.indexOf(action) != -1? alert('True') : alert ('False'); 

而你想做更多然后简单的声明做:

  names.indexOf(action) != -1? doSomethingOnTrue() : doSomethingOnFalse(); 
 if('abcdefg'.indexOf(action) > -1){ // action is one of 'abcdef' }