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

IT技术 javascript comparison
2021-01-29 09:51:11

请告诉我最漂亮的方式来比较倍数选择一个值?

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

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

if (foobar == (foo||bar) ) {
     //do something
}
6个回答

不要试图太偷偷摸摸,尤其是当它不必要地影响性能时。如果您真的有一大堆比较要做,只需将其格式化即可。

if (foobar === foo ||
    foobar === bar ||
    foobar === baz ||
    foobar === pew) {
     //do something
}
在我的世界里,可读性 === 漂亮。这是最易读的。
2021-03-16 09:51:11
你可以使用 Array.prototype.every(): [foo, bar].every(elem => elem === compareValue);
2021-03-16 09:51:11
如果您将具有降序概率的术语排序为真,则可以加快速度。:)
2021-03-19 09:51:11
如果您正在比较的项目在您编写代码时已知,则此方法有效,但可能不适合您比较的项目是可变的情况。
2021-04-04 09:51:11

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

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;
    }
}
使用 ES6 的新方法是使用includesstackoverflow.com/questions/2430000/...
2021-03-10 09:51:11
Array.indexOf方法仅在 Javascript 1.6 及更高版本中受支持,因此您需要对旧浏览器进行回退。
2021-03-11 09:51:11
@l33t 哈哈,不错。显然不是,但不会走那么远......我会使用 [a, b, c, ...].includes(val)
2021-03-13 09:51:11
indexOffor arrays 只在 IE 版本 9 开始提供,所以我会避免使用它,直到 8 退出市场(不幸的是,还有很长的路要走)。也就是说,MDN为不支持它的浏览器提供了示例实现代码。
2021-03-16 09:51:11
@baptx 这应该是第一个答案。更具可读性,就像 Python 的 foo in (bar, baz) 一样。
2021-03-21 09:51:11

由于没有人添加明显的解决方案,但对于两个比较来说效果很好,我将提供它:

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,其中有很多。另一个答案中描述了一个

Set 比普通 Array: 更好的地方是if(['foo', 'bar'].includes(value))什么?
2021-03-11 09:51:11
@DIES - ASet使用哈希表查找,而.includes()使用线性搜索。当集合中有多个项目时,Set 应该快得多来查看项目是否在Set. 另外,.add()为了Set防止重复。
2021-03-12 09:51:11
Sets 仍然比对字符串比较的本机优化慢。让浏览器做优化。试图超越浏览器的人几乎总是以更慢的代码告终。
2021-03-28 09:51:11
@JackGiffin - 你在这里有什么建议?我的答案的第一部分只是最简单的比较,JS 引擎可以根据自己的喜好进行优化。我使用 a 的答案的第二部分Set针对您有很多值要比较(数百或数千)的情况。我不明白你在建议什么而不是这些,或者你认为这些建议有什么问题?
2021-04-05 09:51:11

您可以使用开关:

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

只是为了踢球,因为这个问答似乎是关于语法微观分析的,对安德烈·阿尔萨达·帕德兹的建议进行了微小的修改:

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

if (~[foo, bar].indexOf(foobar)) {
    // pretty
}
!!~['foo', 'bar'].indexOf('foo') 🙃
2021-03-27 09:51:11