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

the*_*dow 59 javascript comparison

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

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

我问,因为我希望这是可行的(当你看它时,它显然不是这样):

if (foobar == (foo||bar) ) {
     //do something
}
Run Code Online (Sandbox Code Playgroud)

dav*_*vid 93

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

if (foobar === foo ||
    foobar === bar ||
    foobar === baz ||
    foobar === pew) {
     //do something
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您按降序概率对术语进行排序,则可以加快速度.:) (14认同)
  • @ techie_28这只会检查`foobar === pew` (3认同)

And*_*dez 59

我用来做的是将多个值放在数组中

var options = [foo, bar];
Run Code Online (Sandbox Code Playgroud)

然后,使用indexOf()

if(options.indexOf(foobar) > -1){
   //do something
}
Run Code Online (Sandbox Code Playgroud)

为了美好:

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

对于旧浏览器:
(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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用 ES6 执行此操作的新方法是使用“includes”:/sf/ask/170100031/#2555311 (4认同)
  • 数组的`indexOf` 仅在 IE 版本 9 开始提供,所以我会避免使用它,直到 8 退出市场(不幸的是,还有很长的路要走)。也就是说,[MDN](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf) 为不支持它的浏览器提供了示例实现代码。 (2认同)

Guf*_*ffa 18

你可以使用一个开关:

switch (foobar) {
  case foo:
  case bar:
    // do something
}
Run Code Online (Sandbox Code Playgroud)


jfr*_*d00 16

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

if (foobar === foo || foobar === bar) {
     //do something
}
Run Code Online (Sandbox Code Playgroud)

而且,如果你有很多值(可能是数百或数千),那么我建议制作一个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
}
Run Code Online (Sandbox Code Playgroud)

对于ES6之前的版本,您可以获得一个有很多的Set polyfill.在另一个答案中描述了一个.

  • @DIES - `Set` 使用哈希表查找,而 `.includes()` 使用线性搜索。当集合中的项目较多时,Set 应该会更快地查看某个项目是否在“Set”中。另外,“Set”的“.add()”可以防止重复。 (7认同)
  • @JackGiffin - 你在这里有什么建议?我的答案的第一部分只是最简单的比较,JS 引擎可以根据自己的喜好进行优化。我的答案的第二部分使用了“Set”,它针对的是您有很多要比较的值(数百或数千)的情况。我不明白你在建议什么而不是这些,或者你认为这些建议有什么问题? (2认同)

luc*_*eer 16

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

(当然还包括IE9前垫片/ shiv/polyfill)

if (~[foo, bar].indexOf(foobar)) {
    // pretty
}
Run Code Online (Sandbox Code Playgroud)

  • `!!~['foo', 'bar'].indexOf('foo')` (2认同)

Ion*_*zău 8

为什么不使用indexOf像下面这样的数组呢?

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

只是普通的Javascript,没有框架或库,但它不适用于IE <9.


归档时间:

查看次数:

94671 次

最近记录:

7 年,4 月 前