Optimize OR in IF

前端 未结 7 805
不思量自难忘°
不思量自难忘° 2021-01-22 01:50

I have a code like this:

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

How do I m

相关标签:
7条回答
  • 2021-01-22 02:34

    Cross-browser solution:

    if ( action in {'John':1, 'John Beckham':1, 'John Henry':1, 'Giggs John':1, 'Scholes John':1, 'John Messi':1 } ){
         alert('true!');
    }
    
    0 讨论(0)
  • 2021-01-22 02:35

    If "John" always appears, the simplest thing is:

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

    ...but as your question has already changed the values against which you're checking action once, I hesitate to assume that. Also note that it will match "xxxjohnxxx", which may not be what you want.

    Original suggestions (updated for new action values from your edit):


    There are lots of ways, all shown using case insensitivity since you mentioned that in the comments:

    String#indexOf:

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

    Regular expressions:

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

    Because you're just using the true/false result, I'm using test which just returns true/false, instead of exec which returns matching results. Both work in this case, but the browser may be able to ever-so-slightly optimize test (but then, regex is unlikely to be the best solution if your goal is the fastest result or the least memory use).


    Or a switch:

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

    Or an object lookup:

    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
    }
    

    (That also has the advantage of letting you say what to do — e.g., the true could be replaced with a function you call.)


    Or (on an ES5-enabled environment or with an ES5 shim) Array#indexOf:

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

    or since you use jQuery, you can avoid the shim on older browsers by using inArray:

    if ($.inArray(action.toLowerCase(), ["john", "john beckham", "john henry", "giggs john", "scholes john", "john messi"]) !== -1) {
        // Do something
    }
    
    0 讨论(0)
  • 2021-01-22 02:42

    Make an array as below.

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

    Now just check it as below.

    $(function()
    {
        var newAry = Array('a','b','c');
        if($.inArray(action,newAry)){ alert(action); }
    });
    
    0 讨论(0)
  • 2021-01-22 02:43

    if using jquery, then you could do:

    var arr = ['a','b','c','d','e','f','g'];
    if( $.inArray(action, arr) !== -1 ) {
      alert("true");
    }
    
    0 讨论(0)
  • 2021-01-22 02:47

    Try this, it uses indexOf:

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

    Update: If you want to support IE7 and below, use the answer to this question

    If you're using jQuery, you can use $.inArray like this:

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

    UPDATE

    You can also use a regexp with test (The group makes the regexp not match "John Langhammerer" / actions with extra chars to the ones to be matched):

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

    UPDATE: /i makes the regexp case insensitive.

    Below is a solution which would have worked for one-char actions:

    You can also use String.indexOf which is supported in IE7 (if your actions are all one char):

    if ('abcde'.indexOf(action) > -1) {
      alert(true);
    }
    
    0 讨论(0)
  • 2021-01-22 02:55
    if('abcdefg'.indexOf(action) > -1){
        // action is one of 'abcdef'
    }
    
    0 讨论(0)
提交回复
热议问题