提问人:thelastshadow 提问时间:2/3/2012 最后编辑:isherwoodthelastshadow 更新时间:2/1/2022 访问量:204112
将一个值与多个值进行比较的最漂亮的方法是什么?[复制]
What's the prettiest way to compare one value against multiple values? [duplicate]
问:
将一个值与多个选项进行比较的最漂亮的方法是什么?
我知道有很多方法可以做到这一点,但我正在寻找最简洁的方法。
我问是因为我希望这是可行的(当你看到它时,很明显它不是):
if (foobar == (foo||bar) ) {
//do something
}
答:
您可以使用开关:
switch (foobar) {
case foo:
case bar:
// 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;
}
}
评论
indexOf
for arrays 仅在 IE 中从版本 9 开始提供,因此在 8 退出市场之前,我会避免使用它(不幸的是,还有很长的路要走)。也就是说,MDN 为不支持它的浏览器提供了示例实现代码。
Array.indexOf
由于还没有人添加明显的解决方案,该解决方案适用于两个比较,因此我将提供它:
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
仍然比字符串比较的本机优化慢。让浏览器进行优化。试图超越浏览器的人几乎总是以慢得多的代码告终。
Set
if(['foo', 'bar'].includes(value))
Set
.includes()
Set
.add()
Set
(foobar == foo || foobar == bar)
否则,如果仅根据单个整数、枚举值或 String 对象比较表达式,则可以使用 switch。请参见 switch 语句。您也可以使用安德烈·阿尔萨达·帕德斯 (André Alçada Padez) 建议的方法。最终,您的选择将取决于您正在做的事情的细节。
评论
不要试图太偷偷摸摸,尤其是当它不必要地影响性能时。 如果你真的有一大堆比较要做,只需很好地格式化它。
if (foobar === foo ||
foobar === bar ||
foobar === baz ||
foobar === pew) {
//do something
}
评论
只是为了踢球,因为这个问答似乎是关于语法微观分析的,这是对安德烈·阿尔萨达·帕德斯(André Alçada Padez)建议的微小修改:
(当然,还包括他包括的 IE9 之前的垫片/shiv/polyfill)
if (~[foo, bar].indexOf(foobar)) {
// pretty
}
评论
!!~['foo', 'bar'].indexOf('foo')
🙃
!!
if
为什么不像下面这样使用 from 数组?indexOf
if ([foo, bar].indexOf(foobar) !== -1) {
// do something
}
只是普通的 Javascript,没有框架或库,但它不适用于 IE < 9。
评论
我喜欢使用数组测试 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*/ }
1 === (2 || 1)