6

Is there a simpler way to rewrite the following condition in JavaScript?

if ((x == 1) || (x == 3) || (x == 4) || (x == 17) || (x == 80)) {...}
Penny Liu
  • 15,447
  • 5
  • 79
  • 98
Misha Moroshko
  • 166,356
  • 226
  • 505
  • 746

8 Answers8

17

You could use an array of valid values and test it with indexOf:

if ([1, 3, 4, 17, 80].indexOf(x) != -1)

Edit    Note that indexOf was just added in ECMAScript 5 and thus is not implemented in every browser. But you can use the following code to add it if missing:

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

Or, if you’re already using a JavaScript framework, you can also use its implementation of that method.

Gumbo
  • 643,351
  • 109
  • 780
  • 844
  • 1
    +1... This is the neatest. The `in` operator does not work correctly for arrays, as you suggested: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Special_Operators/in_Operator – Daniel Vassallo Apr 13 '10 at 14:45
  • 1
    @sterofrog: You can add indexOf to older browsers: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/indexOf – Daniel Vassallo Apr 13 '10 at 14:49
  • 1
    @Daniel: yes, this should be added to the answer, for gooogler's benefit – user187291 Apr 13 '10 at 15:07
  • 1
    Bear in mind that setting Array prototype members breaks the for (i in array) construct, as those prototype members will show up as items of every array. If Array prototype members are set (e.g. with this, by mootools, etc.), you have to iterate over the members with `for var i = 0; i < array.length; i++` , or use a framework function that handles it for you (e.g. jQuery.each()). – Joey Adams Apr 13 '10 at 15:42
  • 1
    @Joey Adams: `for … in` is for object properties and not array keys. *Always* use a the standard ranging `for` loop for array iteration. (jQuery does that too.) – Gumbo Apr 13 '10 at 15:54
7
switch (x) {
    case 1:
    case 3:
    case 4:
    case 17:
    case 80:
        //code
        break;
    default:
        //code
}
3

This is a little function I found somewhere on the web:

function oc(a) {
    var o = {};
    for (var i = 0; i < a.length; i++) {
        o[a[i]] = '';
    }
    return o;
}

Used like this:

if (x in oc(1, 3, 4, 17, 80)) {...}

I'm using it for strings myself; haven't tried with numbers, but I guess it would work.

Edgar
  • 4,348
  • 4
  • 40
  • 59
2

a regular expression test uses the string value of x:

if(/^[134]|17|80$/.test(x)){/*...*/}
kennebec
  • 102,654
  • 32
  • 106
  • 127
1

You can optimize your own example and get rid of a few characters, making it easier on the eyes..:

if (x == 1 || x == 3 || x == 4 || x == 17 || x == 80) { ... }
cllpse
  • 21,396
  • 37
  • 131
  • 170
0

many options

if ([0, 1, 3, 4, 17, 80].indexOf(x) > 0)

if(/^(1|3|4|17|80)$/.test(x))

if($.inArray(x, [1, 3, 4, 17, 80]) 

another one, based on Ed's answer

function list() {
    for (var i = 0, o = {}; i < arguments.length; i++)
        o[arguments[i]] = '';
    return o;
}


if(x in list(1, 3, 4, 17, 80))...
Community
  • 1
  • 1
user187291
  • 53,363
  • 19
  • 95
  • 127
0

You can also use the Array.includes the simplest way...

    if([1,3,4,17,80].includes(x)){
        console.log(true); 
        // rest of the code
    }
Santosh
  • 875
  • 5
  • 14
  • 33
0

Inspired by @Santosh I created a simplified version:

const input = x => [1, 3, 4, 17, 80].includes(x);

console.log(input(10));
console.log(input(1));
Penny Liu
  • 15,447
  • 5
  • 79
  • 98