如何以最简单的方式将一个值与多个选项进行比较?
我知道有很多方法可以做到这一点,但我正在寻找最整洁的方法。
我之所以问这个问题,是因为我曾经希望以下代码可行(显然它不可行):
if (foobar == (foo||bar) ) {
//do something
}
如何以最简单的方式将一个值与多个选项进行比较?
我知道有很多方法可以做到这一点,但我正在寻找最整洁的方法。
我之所以问这个问题,是因为我曾经希望以下代码可行(显然它不可行):
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/zh-CN/docs/Web/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;
}
}
indexOf
方法只在 IE 9 及以上版本中提供,因此我建议在 IE 8 退出市场之前不要使用它(可惜这还需要很长时间)。话虽如此,MDN 提供了适用于不支持该方法的浏览器的示例实现代码。 - ReidArray.indexOf
方法仅支持 Javascript 1.6 及更高版本,因此您需要为旧版浏览器提供备用方案。 - Guffaincludes
:https://dev59.com/JHE95IYBdhLWcg3wKqsk#2555311 - baptx由于还没有人添加明显的解决方案,这个方案适用于两个比较,我将提供它:
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
比本地优化的字符串比较仍然慢。让浏览器进行优化。试图聪明地超越浏览器的人几乎总是最终得到更慢的代码。 - Jack Gif(['foo', 'bar'].includes(value))
? - DIESSet
使用哈希表查找,而.includes()
使用线性搜索。当集合中的项目超过几个时,使用Set
将比使用.includes()
更快地查找项目。此外,对于Set
,.add()
可以防止重复项。 - jfriend00switch (foobar) {
case foo:
case bar:
// do something
}
仅仅为了好玩,因为这个问答似乎是关于语法微观分析的,对André Alçada Padez的建议进行了微小的修改:
(当然也要考虑他包含的IE9之前的shim/shiv/polyfill)
if (~[foo, bar].indexOf(foobar)) {
// pretty
}
!!~['foo', 'bar'].indexOf('foo')
- Pavel Levin!!
,因为if
已经测试了表达式的真实性。 - Unmitigated为什么不像下面这样从数组中使用 indexOf
?
if ([foo, bar].indexOf(foobar) !== -1) {
// do something
}
这是纯JavaScript,没有任何框架或库,但在IE 9以下的浏览器上无法使用。
(foobar == foo || foobar == bar)
如果你只是比较基于单个整数、枚举值或字符串对象的表达式,可以使用 switch 语句。详见switch 语句。也可以采用 André Alçada Padez 建议的方法。最终选择将取决于你所做的具体细节。
我喜欢使用数组测试indexOf的漂亮形式,但请注意,这在所有浏览器中都不起作用(因为旧版IExplorers中不存在Array.prototype.indexOf)。
然而,可以通过使用jQuery的$.inArray()函数来实现类似的功能:
if ($.inArray(field, ['value1', 'value2', 'value3']) > -1) {
alert('value ' + field + ' is into the list');
}
这段代码可以更好,所以你不应该测试indexOf是否存在。
在比较时要小心(不要使用== true/false),因为$.inArray返回匹配位置的索引,其中值已被找到,如果索引为0,则当它实际存在于数组中时,它将为false。
if(/foo|bar|ow|my|javascript|works/.test( foobar )) { /*do something*/ }
。这个问题和我的类似。 - Ron van der Heijden1 === (2 || 1)
将返回 false... - Neil