关于比较:javascript:检查变量是否等于两个或多个值的简单方法?

JavaScript: Simple way to check if variable is equal to two or more values?

本问题已经有最佳答案,请猛点这里访问。

有没有更容易的方式,在确定如果一个变量是平等的一个范围值,如:

1
if x === 5 || 6

我obtuse比什么样:

1
if x === 5 || x === 6

???????


您可以将值存储在数组中,并使用[].indexOf检查数组中是否存在该变量:

1
2
3
if([5, 6].indexOf(x) > -1) {
  // ...
}

如果返回-1,则数组中不存在该变量。


取决于你正在进行什么样的测试。如果您有静态字符串,那么很容易通过正则表达式进行检查:

1
2
3
4
5
6
7
if (/^[56ab]$/.test(item)) {
//-or-
if (/^(foo|bar|baz|fizz|buzz)$/.test(item)) {
    doStuff();
} else {
    doOtherStuff();
}

如果您有一组很小的值(字符串或数字),则可以使用switch

1
2
3
4
5
6
7
8
9
10
switch (item) {
case 1:
case 2:
case 3:
    doStuff();
    break;
default:
    doOtherStuff();
    break;
}

如果您有一个长的值列表,那么您可能应该使用一个带有~arr.indexOf(item)arr.contains(item)的数组:

1
2
3
4
5
6
vals = [1,3,18,3902,...];
if (~vals.indexOf(item)) {
    doStuff();
} else {
    doOtherStuff();
}

不幸的是,在一些浏览器中不支持EDOCX1 6。幸运的是,有一种聚填料。如果你遇到了填充Array.prototype.indexOf的麻烦,你也可以添加EDOCX1,8。

根据如何关联数据,可以将对象内的字符串动态列表存储为映射到其他相关信息:

1
2
3
4
5
6
7
8
9
10
11
var map = {
    foo: bar,
    fizz: buzz
}
if (item in map) {
//-or-
if (map.hasOwnProperty(item)) {
    doStuff(map[item]);
} else {
    doOtherStuff();
}

<子> EDCOX1 9将检查整个原型链,而EDCOX1(10)将只检查对象,所以注意它们是不同的。< / SUB>


很好。如果您有一个更长的值列表,也许您可以使用以下内容:

1
2
if ([5,6,7,8].indexOf(x) > -1) {
}


对。你可以使用你自己的功能。本例使用.some

1
2
3
4
5
var foo = [ 5, 6 ].some(function(val) {
     return val === x;
   });

foo; // true


这是我决定使用的:

1
2
3
4
5
6
7
8
9
10
11
Object.prototype.isin = function() {
    for(var i = arguments.length; i--;) {
        var a = arguments[i];
        if(a.constructor === Array) {
            for(var j = a.length; j--;)
                if(a[j] == this) return true;
        }
        else if(a == this) return true;
    }
    return false;
}

您可以这样使用它:

1
2
3
4
5
6
7
var fav   = 'pear',
    fruit = ['apple', 'banana', 'orange', 'pear'],
    plu   = [4152, 4231, 3030, 4409];

if (fav.isin(fruit, plu, 'eggs', 'cheese')) {
    //do something cool
}

其优点是:

  • 在IE<9时工作;
  • 从左到右自然读;
  • 您可以为它提供数组或单独的值。

如果不允许类型强制(indexOf不允许),将两个==改为===。正如它所代表的:

1
2
3
fav ="4231";
plu.indexOf(fav) //-1
fav.isin(plu)    //true

不,可能有一些特定于具体情况的技巧,但一般来说,我编写的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
if (someVariable === 1 ||
    someVariable === 2 ||
    someVariable === 7 ||
    someVariable === 12 ||
    someVariable === 14 ||
    someVariable === 19) {

    doStuff();
    moreStuff();

} else {
    differentStuff();
}


[编辑]这似乎有效,但正如丹指出的,这实际上是一个误报。不要使用这种方法。我把它留在这里是为了教育目的。

最简单的方法我知道:

1
2
3
a = [1,2,3,4,5];

if(3 in a) alert("true"); // will alert true

在Chrome控制台中测试。不确定它是否在其他浏览器中工作。


简单的答案是"否"。您可以使用switch语句,如果比较大量的字符串值,则更容易阅读该语句,但将其用于两个值并不会有更好的效果。