6

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

if ((x == 1) || (x == 3) || (x == 4) || (x == 17) || (x == 80)) {...}

8 Answers 8

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.

Sign up to request clarification or add additional context in comments.

5 Comments

+1... This is the neatest. The in operator does not work correctly for arrays, as you suggested: developer.mozilla.org/en/Core_JavaScript_1.5_Reference/…
@sterofrog: You can add indexOf to older browsers: developer.mozilla.org/en/Core_JavaScript_1.5_Reference/…
@Daniel: yes, this should be added to the answer, for gooogler's benefit
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: 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.)
7
switch (x) {
    case 1:
    case 3:
    case 4:
    case 17:
    case 80:
        //code
        break;
    default:
        //code
}

4 Comments

not exactly simpler, but a nice alternative, and good use of not using a break, which btw you forgot to put after the code in case 80:
and you need the break in the default case
@BritishDeveloper the default clause doesn't require a break, as there cannot be any cases after the default. For example, see w3schools.com/js/js_switch.asp
@cmptrgeekken true - i had my c# eyes in
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.

Comments

2

a regular expression test uses the string value of x:

if(/^[134]|17|80$/.test(x)){/*...*/}

Comments

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) { ... }

Comments

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))...

6 Comments

JavaScript’s array index starts with 0.
@stereofrog: Yes: [0, 1, 3, 4, 17, 80].indexOf(0) === 0.
@stereofrog: so, I think if ([0, 1, 3, 4, 17, 80].indexOf(x) > 0) needs to be if ([0, 1, 3, 4, 17, 80].indexOf(x) >= 0)
@Daniel Vassallo, this would return 'true' for x=0, which is wrong
@stereofrog: Ok, I see that you've added an extra element in the array. But why not if ([1, 3, 4, 17, 80].indexOf(x) != -1)?
|
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
    }

Comments

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));

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.