我正在检查一个变量,例如foo
,是否与多个值相等。例如,
if( foo == 1 || foo == 3 || foo == 12 ) {
// ...
}
关键是对于这样一个微不足道的任务,它是相当多的代码。我想出了以下内容:
if( foo in {1: 1, 3: 1, 12: 1} ) {
// ...
}
但这并不完全吸引我,因为我必须为对象中的项目赋予冗余值。
有谁知道对多个值进行平等检查的体面方法吗?
我正在检查一个变量,例如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)
在 ECMA2016 中,您可以使用includes方法。这是我见过的最干净的方式。(所有主流浏览器都支持)
if([1,3,12].includes(foo)) {
// ...
}
使用提供的答案,我最终得到以下结果:
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)) {
// ...
}
编辑:我最近遇到了这个“技巧”,如果值是字符串并且不包含特殊字符,它会很有用。对于特殊字符,由于转义而变得丑陋,并且因此更容易出错。
/foo|bar|something/.test(str);
更准确地说,这将检查确切的字符串,但对于简单的相等性测试,这又变得更加复杂:
/^(foo|bar|something)$/.test(str);
if(foo in L(10,20,30))
如果你定义L
为,你可以写
var L = function()
{
var obj = {};
for(var i=0; i<arguments.length; i++)
obj[arguments[i]] = null;
return obj;
};
现在您可能有更好的解决方案来解决这种情况,但我更喜欢其他方式。
const arr = [1,3,12]
if( arr.includes(foo)) { // it will return true if you `foo` is one of array values else false
// code here
}
我更喜欢上面的解决方案,而不是 indexOf 检查,您还需要检查索引。
if ( arr.indexOf( foo ) !== -1 ) { }