根据值列表检查变量相等性

pim*_*vdb 122 javascript

我正在检查一个变量,例如foo,与多个值的相等性.例如,

if( foo == 1 || foo == 3 || foo == 12 ) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

关键是这个繁琐的任务代码相当多.我想出了以下内容:

if( foo in {1: 1, 3: 1, 12: 1} ) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但这并不完全吸引我,因为我必须为对象中的项目提供冗余值.

有没有人知道对多个值进行相等检查的正确方法?

Gum*_*mbo 166

您可以使用数组并indexOf:

if ([1,3,12].indexOf(foo) > -1)
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用 `~` 运算符代替 `> -1`:`if ( ~[...].indexOf(foo) ) { ... }` (3认同)

Ali*_*ter 99

在ECMA2016中,您可以使用包含方法.这是我见过的最干净的方式.(所有主流浏览器均支持,IE除外(Polyfill在链接中)

if([1,3,12].includes(foo)) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 对于变量`if([a,b,c] .includes(foo))`或字符串`if(['a','b','c'].includes(foo))` (4认同)
  • @BinodShrestha我认为那是我写的,除非我遗漏了一些东西。“对于变量..或字符串...” (2认同)

pim*_*vdb 17

使用提供的答案,我最终得到以下结果:

Object.prototype.in = function() {
    for(var i=0; i<arguments.length; i++)
       if(arguments[i] == this) return true;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

它可以被称为:

if(foo.in(1, 3, 12)) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

编辑:我最近遇到了这个'技巧',如果值是字符串并且不包含特殊字符,这很有用.对于特殊字符而言,由于转义而变得丑陋,并且由于这种情况也更容易出错.

/foo|bar|something/.test(str);
Run Code Online (Sandbox Code Playgroud)

更确切地说,这将检查确切的字符串,但对于简单的相等测试再次更复杂:

/^(foo|bar|something)$/.test(str);
Run Code Online (Sandbox Code Playgroud)

  • 天哪!令我感到震惊的是 - "in"是Javascript中的关键字.例如,运行`function in(){}; in()`导致语法错误,至少在Firefox中,我不确定为什么你的代码没有.:-) (4认同)
  • 扩展Object.prototype是一种反模式,不应使用。改用一个函数。 (3认同)
  • 此外,扩展`Object.prototype`通常被认为是不好的做法,因为它以不幸的方式影响`for(foo in bar)`.也许将它改为`function contains(obj){for(var i = 1; i <arguments.length; i ++)if(arguments [i] === obj)return true; 返回false; 并且将对象作为参数传递? (2认同)
  • 如上所述,以这种方式扩展“Object.prototype”有严重的缺点,并且可能导致许多错误。如果您确实想扩展“Object.prototype”,请始终通过“Object.defineProperty”进行扩展,而无需在描述符中设置“enumerable”。 (2认同)
  • @BenBlank - 仅供参考,使用关键字作为文字属性名称在第五版规范(2009 年 12 月)中变得有效,这就是 `x.in()` 起作用的原因。在第五版之前,您必须使用计算属性名称(`x["in"]()`)。 (2认同)

Jav*_*ved 9

现在您可能有更好的解决方案来解决这种情况,但我更喜欢其他方式。

const arr = [1,3,12]
if( arr.includes(foo)) { // it will return true if you `foo` is one of array values else false
  // code here    
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢上面的解决方案,而不是 indexOf 检查,您还需要检查索引。

包括文档

if ( arr.indexOf( foo ) !== -1 ) { }
Run Code Online (Sandbox Code Playgroud)


Eli*_*ing 8

if(foo in L(10,20,30))如果定义L为,则可以编写

var L = function()
{
    var obj = {};
    for(var i=0; i<arguments.length; i++)
        obj[arguments[i]] = null;

    return obj;
};
Run Code Online (Sandbox Code Playgroud)

  • 我认为谨慎地说原型函数也在'数组/对象'中 - 所以如果在数组/对象的原型中有一个'remove'函数,如果在L中编码''remove',它将始终返回true (1,3,12)`,虽然你没有指定'remove'放在列表中. (2认同)

orl*_*rlp 7

这很容易扩展和可读:

switch (foo) {
    case 1:
    case 3:
    case 12:
        // ...
        break

    case 4:
    case 5:
    case 6:
        // something else
        break
}
Run Code Online (Sandbox Code Playgroud)

但不一定更容易:)


med*_*iev 6

var a = [1,2,3];

if ( a.indexOf( 1 ) !== -1 ) { }
Run Code Online (Sandbox Code Playgroud)

请注意,indexOf不在核心ECMAScript中.您需要为IE以及可能不支持Array.prototype.indexOf的其他浏览器提供一个代码段.

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(searchElement /*, fromIndex */)
  {
    "use strict";

    if (this === void 0 || 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)
        n = 0;
      else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))
        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)


Iva*_*vak 5

另外,由于您要检查结果的值都是唯一的,因此您也可以使用Set.prototype.has() 。

var valid = [1, 3, 12];
var goodFoo = 3;
var badFoo = 55;

// Test
console.log( new Set(valid).has(goodFoo) );
console.log( new Set(valid).has(badFoo) );
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

109741 次

最近记录:

6 年 前