根据值列表检查variables相等性

我正在检查一个variables,比如说foo ,它是否等于许多值。 例如,

 if( foo == 1 || foo == 3 || foo == 12 ) { // ... } 

重点在于这样一个简单的任务是相当多的代码。 我想出了以下几点:

 if( foo in {1: 1, 3: 1, 12: 1} ) { // ... } 

但这也不完全吸引我,因为我必须给对象中的项目赋予多余的值。

有没有人知道一个体面的方式进行平等检查多个值?

你可以使用一个数组和indexOf

 if ([1,3,12].indexOf(foo) > -1) 

使用提供的答案,我结束了以下几点:

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

它可以被称为:

 if(foo.in(1, 3, 12)) { // ... } 

编辑:我最近遇到了这个“技巧”,如果值是string,不包含特殊字符,这是有用的。 由于特殊字符由于逃逸而变得难看,并且由于这个原因也更容易出错。

 /foo|bar|something/.test(str); 

更准确地说,这将检查确切的string,但是对于简单的相等性testing来说再复杂一些:

 /^(foo|bar|something)$/.test(str); 

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

 if([1,3,12].includes(foo)) { // ... } 
 var a = [1,2,3]; if ( a.indexOf( 1 ) !== -1 ) { } 

请注意,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; }; } 

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

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

这很容易扩展和可读:

 switch (foo) { case 1: case 3: case 12: // ... break case 4: case 5: case 6: // something else break } 

但不一定更容易:)

我喜欢这个被接受的答案,但是认为它也可以把数组作为整数,所以我将其扩展为:

 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 lucky = 7, more = [7, 11, 42]; lucky.isin(2, 3, 5, 8, more) //true 

您可以通过将==更改为===来删除types强制。

如果您有权访问Underscore,则可以使用以下方法:

 if (_.contains([1, 3, 12], foo)) { // ... } 

contains用于在Lodash(V4之前)工作,现在你必须使用includes

 if (_.includes([1, 3, 12], foo)) { handleYellowFruit(); } 

而且,由于您检查结果的值都是唯一的,所以您也可以使用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) ); 

我只是使用jQuery inArray函数和一个值的数组来完成这个:

 myArr = ["A", "B", "C", "C-"]; var test = $.inArray("C", myArr) // returns index of 2 returns -1 if not in array if(test >= 0) // true