根据值列表检查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