Javascript:将一个值与多个值进行比较的最漂亮的方法

时间:2012-02-02 23:09:32

标签: javascript comparison

最漂亮的方法是如何将一个值与多个选项进行比较?

我知道有很多方法可以做到这一点,但我正在寻找最好的。

我问,因为我希望这是可行的(当你看的时候不是很明显):

if (foobar == (foo||bar) ) {
     //do something
}

9 个答案:

答案 0 :(得分:80)

不要试图过于偷偷摸摸,特别是当它不必要地影响性能时。 如果你真的有一大堆比较要做,那就好好格式化。

if (foobar === foo ||
    foobar === bar ||
    foobar === baz ||
    foobar === pew) {
     //do something
}

答案 1 :(得分:57)

我用来做的是将这些多个值放在像

这样的数组中
var options = [foo, bar];

然后,使用indexOf()

if(options.indexOf(foobar) > -1){
   //do something
}

美貌:

if([foo, bar].indexOf(foobar) +1){
   //you can't get any more pretty than this :)
}

以及旧浏览器:
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/IndexOf

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
        "use strict";
        if (this == null) {
            throw new TypeError();
        }
        var t = Object(this);
        var len = t.length >>> 0;
        if (len === 0) {
            return -1;
        }
        var n = 0;
        if (arguments.length > 0) {
            n = Number(arguments[1]);
            if (n != n) { // shortcut for verifying if it's NaN
                n = 0;
            } else if (n != 0 && n != Infinity && n != -Infinity) {
                n = (n > 0 || -1) * Math.floor(Math.abs(n));
            }
        }
        if (n >= len) {
            return -1;
        }
        var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
        for (; k < len; k++) {
            if (k in t && t[k] === searchElement) {
                return k;
            }
        }
        return -1;
    }
}

答案 2 :(得分:16)

您可以使用开关:

switch (foobar) {
  case foo:
  case bar:
    // do something
}

答案 3 :(得分:16)

仅仅是为了踢,因为这个Q&amp; A确实似乎是关于语法微观分析,对AndréAlçadaPadez的建议进行了微小的修改:

(当然还包括他所包含的IE9前shim / shiv / polyfill)

if (~[foo, bar].indexOf(foobar)) {
    // pretty
}

答案 4 :(得分:14)

由于没有人添加明显的解决方案,这对于两次比较工作正常,我会提供它:

if (foobar === foo || foobar === bar) {
     //do something
}

而且,如果你有很多值(可能是数百或数千),那么我建议制作一个Set,因为这样可以制作非常干净简单的比较代码并且它在运行时速度很快:

// pre-construct the Set
var tSet = new Set(["foo", "bar", "test1", "test2", "test3", ...]);

// test the Set at runtime
if (tSet.has(foobar)) {
    // do something
}

对于ES6之前的版本,您可以获得一个有很多的Set polyfill。其中一个在other answer中进行了描述。

答案 5 :(得分:7)

为什么不在数组中使用indexOf,如下所示?

if ([foo, bar].indexOf(foobar) !== -1) {
    // do something
}

简单的Javascript,没有框架或库,但它会not work on IE < 9

答案 6 :(得分:1)

(foobar == foo || foobar == bar)否则,如果仅基于单个整数,枚举值或String对象比较表达式,则可以使用switch。见The switch Statement。您也可以使用AndréAlcaadaPadez建议的方法。最终你选择的东西需要依赖于你正在做的事情的细节。

答案 7 :(得分:1)

我喜欢使用数组测试indexOf的漂亮形式,但请注意,这并不适用于所有浏览器(because Array.prototype.indexOf is not present in old IExplorers)。

但是,使用jQuery和$.inArray()函数有类似的方法:

if ($.inArray(field, ['value1', 'value2', 'value3']) > -1) {
    alert('value ' + field + ' is into the list'); 
}

可能会更好,所以你不应该测试indexOf是否存在。

小心比较(不要使用== true / false),因为$ .inArray返回找到值的匹配位置的索引,如果索引为0,则它​​将为false真的存在于数组中。

答案 8 :(得分:0)

切换方法(如Guffa所述)确实非常好用。但是,大多数短线中的默认警告设置将提醒您使用防坠落功能。这是我使用开关的主要原因之一,所以我几乎忽略了这个警告,但你应该知道使用switch语句的fall-through功能可能会很棘手。在这种情况下,虽然 - 我会去做。