什么'将一个值与多个值进行比较是最漂亮的方法
What's the prettiest way to compare one value against multiple values?
将一个值与多个选项进行比较的最漂亮的方法是什么?
我知道有很多方法可以做到这一点,但我正在寻找最整洁的方法。
我问是因为我希望这是可行的(当你看的时候,很明显不是):
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;
}
}
由于还没有人添加明显的解决方案,可以进行两次比较,所以我将提供它:
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,它有很多。另一个答案中描述了一个。
您可以使用一个开关:
switch (foobar) {
case foo:
case bar:
// do something
}
只是为了踢球,因为这个Q&A似乎是关于语法微观分析的,这是对AndréAlçada Padez建议的一个微小修改:
(当然也包括IE9之前的垫片/垫片/聚乙烯填充物)
if (~[foo, bar].indexOf(foobar)) {
// pretty
}
为什么不使用下面这样的数组中的indexOf
?
if ([foo, bar].indexOf(foobar) !== -1) {
// do something
}
只是简单的Javascript,没有框架或库,但它不会在IE<9.
(foobar == foo || foobar == bar)
否则,如果仅基于单个整数、枚举值或String对象比较表达式,则可以使用switch。请参阅交换机声明。您也可以使用AndréAlçada Padez建议的方法。最终,你选择什么需要取决于你正在做的事情的细节。
我喜欢用数组测试indexOf的漂亮形式,但请注意,这并不适用于所有浏览器(因为旧的IExplorer中不存在array.prototype.indexOf)。
但是,使用带有$.inArray()函数的jQuery也有类似的方法:
if ($.inArray(field, ['value1', 'value2', 'value3']) > -1) {
alert('value ' + field + ' is into the list');
}
它可能会更好,所以你不应该测试indexOf是否存在。
比较时要小心(不要使用==true/false),因为$.inArray返回找到值的匹配位置的索引,如果索引为0,那么当它真正存在于数组中时,它将为false。
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- Javascript集:任何覆盖元素之间比较的方法
- jQuery验证插件-比较两个选择下拉列表的自定义方法
- 任何比较两个不同位图图像并在javascript中检测不同区域的方法
- 如何将 Math.random() 方法生成的当前值与以前的值进行比较
- 为什么 ECMAScript 6 包含 Set 对象,但没有提供比较它们相等的方法
- 我需要使用单独类中的方法将单个对象与数组进行比较
- 如何在 $scope.$watch 方法中比较 oldVal 和 newVal
- 将JavaScript文件插入DOM中(方法比较)
- 比较两种回退机制加载本地jQuery库的方法
- 短手(类型不同)是字符串的正确/错误比较的好方法
- For和While迭代方法的比较
- 比较为零的有效方法
- array.sort()方法中反向比较函数背后的逻辑
- 什么'将一个值与多个值进行比较是最漂亮的方法
- 什么'这是比较Google Sheets中两列数据并使用Google脚本仅输出不匹配数据的最佳方法
- 在这种情况下,java脚本中对象方法的比较返回false
- 在javascript中比较位置的正确方法
- 由于将比较方法添加到数组原型而导致测试失败.如何更新代码或测试?
- Bcrypt-nodejs比较方法每次返回false