JavaScript:检查变量是否等于两个或多个值中的一个的简单方法?

63

是否有更简单的方法确定一个变量是否等于一系列值,例如:

if x === 5 || 6 

而不是像这样晦涩的东西:

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

?


2
你为什么认为后者晦涩难懂? - Alnitak
1
因为我需要编写一些代码来检查变量是否具有20个值中的一个,即如果x =“纽约”||“奥斯汀”||“阿尔伯塔”等。 - Adam Templeton
7
要么把你所有的值都放进一个数组里,然后使用 indexOf 函数。要么你也可以用正则表达式 /^(New York|Austin|Alberta)$/.test(x) - João Silva
1
@AdamTempleton 如果是这种情况,您应该重新编写问题以说明。您在主题中明确提到了“两个”。 - Alnitak
显示剩余2条评论
8个回答

91

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

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

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


10
这在IE < 9中无法工作。请参考MDN的Array#indexOf兼容性部分中的代码,以使其在IE中实际可用。但是,除非您在多个地方使用它,否则最好只使用a == 1 || a == 2,这样可能更快。 - Reid
4
如果您使用JS框架,MooTools和Prototype都保证存在Array#indexOf。另一方面,jQuery通过$.inArray提供了自己的实现。我不熟悉其他框架,但我相信它们都会以某种方式包含这样的功能。 - Reid
代码的更多描述会更好。 - Julix
2
现在我们有 ['a','b'].includes('a') - Devmaleeq

24

取决于您执行的测试类型。如果有静态字符串,可以通过正则表达式轻松检查:

if (/^[56ab]$/.test(item)) {
//-or-
if (/^(foo|bar|baz|fizz|buzz)$/.test(item)) {
    doStuff();
} else {
    doOtherStuff();
}

如果你有一小组数值(字符串或数字),你可以使用switch语句:

switch (item) {
case 1:
case 2:
case 3:
    doStuff();
    break;
default:
    doOtherStuff();
    break;
}

如果你有一个很长的值列表,你应该使用带有~arr.indexOf(item)arr.contains(item)的数组:

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

不幸的是,一些浏览器不支持Array.prototype.indexOf。幸运的是,有一个Polyfill可用。如果你正在努力Polyfill Array.prototype.indexOf,那么也可以添加Array.prototype.contains

根据数据关联的方式,您可以将字符串的动态列表作为映射到其他相关信息的对象中进行存储:

var map = {
    foo: bar,
    fizz: buzz
}
if (item in map) {
//-or-
if (map.hasOwnProperty(item)) {
    doStuff(map[item]);
} else {
    doOtherStuff();
}

in会检查整个原型链,而Object.prototype.hasOwnProperty只会检查对象本身,因此请注意它们的不同之处。


17

完全没问题。如果你有更长的值列表,也许可以使用以下方法:

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

7

是的,您可以使用自己的函数。此示例使用.some方法:

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

foo; // true

4
谢谢您的赞同,因为我之前从未见过 ".some" 这个用法! - Adam Templeton
我认为 .some 只适用于 IE9 或更高版本。 - Graeck

3

这是我决定使用的:

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

您可以这样使用它:

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不会这样做),请将两个==更改为===。目前为止:

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

2

不会,可能有一些特定情况下的技巧,但总体上我编写代码的方式如下:

if (someVariable === 1 ||
    someVariable === 2 ||
    someVariable === 7 ||
    someVariable === 12 ||
    someVariable === 14 ||
    someVariable === 19) {

    doStuff();
    moreStuff();

} else {
    differentStuff();
}

0
简单的回答是不行。如果您正在比较许多字符串值,则可以使用switch语句,这样更易于阅读,但仅用于两个值并没有更好的效果。

-2

[编辑]这个方案似乎可以工作,但正如丹指出的那样,它实际上是一个错误的结果。不要使用这种方法。我将其保留在此供教育目的。

我所知道的最简单的方法:

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

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

在Chrome控制台中测试过。不确定它是否适用于其他浏览器。


那个例子是偶然成功的。尝试一下 3 in [1, 3] - 它会返回 false,因为在数组 [1, 3] 中没有 索引为 3 的元素。同样地,3 in ['a', 'b', 'c', 'd'] 将返回 true。 - Dan Dascalescu
2
该死,原来是误报。谢谢你告诉我。 - Jeremy Thille

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接