2

我有这样的代码:

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

如何最小化此代码?

应该在IE7中工作。

4

7 回答 7

8

如果“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
}

因为您只是使用真/假结果,所以我使用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,您可以使用以下方法避免旧浏览器上的 shim inArray

if ($.inArray(action.toLowerCase(), ["john", "john beckham", "john henry", "giggs john", "scholes john", "john messi"]) !== -1) {
    // Do something
}
于 2013-02-25T12:11:38.710 回答
3

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

var arr = ['a','b','c','d','e','f','g'];
if( $.inArray(action, arr) !== -1 ) {
  alert("true");
}
于 2013-02-25T12:13:06.210 回答
2

试试这个,它使用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);
}

更新

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

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

更新/i使正则表达式不区分大小写。

下面是一个适用于单字符操作的解决方案:

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

if ('abcde'.indexOf(action) > -1) {
  alert(true);
}
于 2013-02-25T12:11:48.417 回答
1

如下创建一个数组。

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

现在只需检查如下。

$(function()
{
    var newAry = Array('a','b','c');
    if($.inArray(action,newAry)){ alert(action); }
});
于 2013-02-25T12:12:34.853 回答
1

跨浏览器解决方案:

if ( action in {'John':1, 'John Beckham':1, 'John Henry':1, 'Giggs John':1, 'Scholes John':1, 'John Messi':1 } ){
     alert('true!');
}
于 2013-02-25T12:18:47.727 回答
1

此外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(); 
于 2013-02-25T12:25:47.153 回答
0
if('abcdefg'.indexOf(action) > -1){
    // action is one of 'abcdef'
}
于 2013-02-25T12:12:01.787 回答