Javascript:最好的方法来比较一个值与多个值
什么是最好的方法来比较一个值与多个选项?
我知道有很多这样做的方法,但我正在寻找最好的。
我问,因为我希望这是可行的(这不是,很显然,当你看着它):
if (foobar == (foo||bar) ) { //do something }
不要试图太狡猾,特别是当它不必要地影响性能时。 如果你真的有一大堆比较的话,就把它格式化好。
if (foobar === foo || foobar === bar || foobar === baz || foobar === pew) { //do something }
我使用的是将这些多个值放在一个数组中
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; } }
只是为了踢,因为这个问答似乎是关于语法微分析的,AndréAlçadaPadez的build议是一个微小的修改:
(当然,他包括在IE9以前的shim / shiv / polyfill中)
if (~[foo, bar].indexOf(foobar)) { // pretty }
你可以使用一个开关:
switch (foobar) { case foo: case bar: // do something }
由于没有人添加明显的解决scheme,但两个比较工作正常,我会提供它:
if (foobar == foo || foobar == bar) { //do something }
而且,如果你有很多的值,那么我会build议做一个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填充。 一个是在这个其他答案中描述的。
为什么不从像波纹pipearrays使用indexOf
?
if ([foo, bar].indexOf(foobar) !== -1) { // do something }
只是简单的Javascript,没有框架或库,但它不会在IE浏览器<9 。
我喜欢用数组testingindexOf的漂亮forms,但是请注意,这在所有浏览器中都不起作用( 因为Array.prototype.indexOf在旧的IExplorers中不存在 )。
不过,使用jQuery和$ .inArray()函数也有类似的方法:
if ($.inArray(field, ['value1', 'value2', 'value3']) > -1) { alert('value ' + field + ' is into the list'); }
这可能会更好,所以你不应该testingindexOf是否存在。
小心比较(不要使用== true或false),因为$ .inArray返回find值的匹配位置的索引,如果索引是0,它确实存在数组。
(foobar == foo || foobar == bar)
否则,如果您仅比较基于单个整数,枚举值或String对象的expression式,则可以使用开关。 请参阅switch语句 。 您也可以使用AndréAlçadaPadezbuild议的方法。 最终你所select的将取决于你在做什么的细节。
切换方法(如Guffa提到的)确实工作得非常好。 但是,大多数短裤中的默认警告设置会提醒您使用穿透。 这是我使用开关的主要原因之一,所以我几乎忽略了这个警告,但是您应该意识到使用switch语句的fall-throughfunction可能会非常棘手。 在这样的情况下,我会去做的。