如果在一个值上声明多个条件而不重复值
If statement multiple conditionals on one value without repeating value
我想知道是否有一种方法可以在不重复该值的情况下检查同一变量或值的多个条件。
例如,如果我有变量 keyCode
,并且我想检查它是否大于 102,或小于 48,或介于 65 和 57 之间,或介于 70 和 97 之间,我会必须这样写:
var keyCode = // some value;
if(
keyCode > 102 ||
keyCode < 48 ||
(keyCode > 57 && keyCode < 65) ||
(keycode > 70 && keyCode < 97)
) {
// do something
}
如你所见,我在if
条件中写了6次keyCode
。如果条件更复杂(这个简单地排除了所有非十六进制字符),那么它可能会更加重复。
我想知道是否有办法简化它。也许是这样的:
if(
keyCode > 102 || < 48 || (> 57 && < 65) || (> 70 && < 97)
) {
// do something
}
其中您可以简单地省略变量名,并将许多条件放在一个变量上。这就像 this question 的反面,其中提问者想知道是否有一种方法可以根据单个条件检查多个变量。
我现在正在用 JS 编写代码,但是如果您知道用任何其他语言实现它,那在将来也可能会有所帮助。我原以为这会很容易实现,因为我经常使用它,但令我惊讶的是我根本找不到任何有关此类语言功能的信息。
某些语言,例如 Python,支持链式比较,因此您可以说 42 < x <= y < 84
。但是,总的来说,我个人并不知道您描述的确切功能。不过看起来不错!
对于像键码这样的小域,您可以将感兴趣的代码放在一个数组中并测试集合成员资格:
if keyCode in (range(102,256)+range(0,49)+range(58,65)+range(71,97)):
# do something
(+
通过将范围全部放在一个列表中来获取范围的并集。)
我知道简化这个的唯一方法是创建具有有意义名称的单独函数,例如:
function inRange(value, min, max) {
return (value > min) && (value < max);
}
function outRange(value, min, max) {
return (value < min) || (value > max);
}
那么您的情况将如下所示:
if (outRange(keyCode, 48, 102) || inRange(keyCode, 57, 65) || inRange(keyCode, 70, 97) ) {
...
}
这更容易理解,因为您看到了原始意图,而不是不同的 >
<
并试图理解它的实际含义
另一种方法是创建对象 rangeChecker
/notInRangeChecker
,然后创建不同范围检查器的数组并创建函数 checkValueAtLeastInOneRange(keyCode, rangesArray)
不,您不能删除变量,因为每个条件都由它自己评估。
但是要重用某些检查,我建议您将它们提取到一个函数对象中(并从另一个文件中获取它):
var keyTester = {
isA: function (keyCode) {
return keyCode > 102;
},
isB: function (keyCode) {
return keyCode < 48;
},
isC: function (keyCode) {
keyCode > 57 && keyCode < 65;
}
};
if (keyTester.isA(keyCode) || keyTester.isB(keyCode) || keyTester.isC(keyCode) ... )
没有办法像那样明智地做一些事情,但你可以做一些事情来尝试效仿:
var keyCode = 40
var ranges = [
[102,Infinity],
[0,48],
[57,65],
[70,97]
]
var allowed = ranges.some(function(values){
return keyCode > values[0] && keyCode < values[1]
})
if(allowed){
console.log("allowed")
}else{
console.log("not allowed")
}
另一个想法 - 为您的变量使用一个短别名,例如 _
:
if(
(_=keyCode) > 102 || _ < 48 || (_ > 57 && _ < 65) || ( _ > 70 && _ < 97)
) {
// do something
}
请确保您不使用 _
来表示无法在 if
语句中丢弃的任何内容:)。 (_=keyCode)
用很少的额外击键来存储值,然后 _
可以在整个过程中使用。 &&
和 ||
评估 left-to-right (reference),因此 _
应该在整个条件的其余部分可用。
我做了一个快速测试:在 Google Chrome,
var x=42;
if((_=x)<99 && _>30) { console.log(x);}
有效(按预期打印 42
)。
我想知道是否有一种方法可以在不重复该值的情况下检查同一变量或值的多个条件。
例如,如果我有变量 keyCode
,并且我想检查它是否大于 102,或小于 48,或介于 65 和 57 之间,或介于 70 和 97 之间,我会必须这样写:
var keyCode = // some value;
if(
keyCode > 102 ||
keyCode < 48 ||
(keyCode > 57 && keyCode < 65) ||
(keycode > 70 && keyCode < 97)
) {
// do something
}
如你所见,我在if
条件中写了6次keyCode
。如果条件更复杂(这个简单地排除了所有非十六进制字符),那么它可能会更加重复。
我想知道是否有办法简化它。也许是这样的:
if(
keyCode > 102 || < 48 || (> 57 && < 65) || (> 70 && < 97)
) {
// do something
}
其中您可以简单地省略变量名,并将许多条件放在一个变量上。这就像 this question 的反面,其中提问者想知道是否有一种方法可以根据单个条件检查多个变量。
我现在正在用 JS 编写代码,但是如果您知道用任何其他语言实现它,那在将来也可能会有所帮助。我原以为这会很容易实现,因为我经常使用它,但令我惊讶的是我根本找不到任何有关此类语言功能的信息。
某些语言,例如 Python,支持链式比较,因此您可以说 42 < x <= y < 84
。但是,总的来说,我个人并不知道您描述的确切功能。不过看起来不错!
对于像键码这样的小域,您可以将感兴趣的代码放在一个数组中并测试集合成员资格:
if keyCode in (range(102,256)+range(0,49)+range(58,65)+range(71,97)):
# do something
(+
通过将范围全部放在一个列表中来获取范围的并集。)
我知道简化这个的唯一方法是创建具有有意义名称的单独函数,例如:
function inRange(value, min, max) {
return (value > min) && (value < max);
}
function outRange(value, min, max) {
return (value < min) || (value > max);
}
那么您的情况将如下所示:
if (outRange(keyCode, 48, 102) || inRange(keyCode, 57, 65) || inRange(keyCode, 70, 97) ) {
...
}
这更容易理解,因为您看到了原始意图,而不是不同的 >
<
并试图理解它的实际含义
另一种方法是创建对象 rangeChecker
/notInRangeChecker
,然后创建不同范围检查器的数组并创建函数 checkValueAtLeastInOneRange(keyCode, rangesArray)
不,您不能删除变量,因为每个条件都由它自己评估。 但是要重用某些检查,我建议您将它们提取到一个函数对象中(并从另一个文件中获取它):
var keyTester = {
isA: function (keyCode) {
return keyCode > 102;
},
isB: function (keyCode) {
return keyCode < 48;
},
isC: function (keyCode) {
keyCode > 57 && keyCode < 65;
}
};
if (keyTester.isA(keyCode) || keyTester.isB(keyCode) || keyTester.isC(keyCode) ... )
没有办法像那样明智地做一些事情,但你可以做一些事情来尝试效仿:
var keyCode = 40
var ranges = [
[102,Infinity],
[0,48],
[57,65],
[70,97]
]
var allowed = ranges.some(function(values){
return keyCode > values[0] && keyCode < values[1]
})
if(allowed){
console.log("allowed")
}else{
console.log("not allowed")
}
另一个想法 - 为您的变量使用一个短别名,例如 _
:
if(
(_=keyCode) > 102 || _ < 48 || (_ > 57 && _ < 65) || ( _ > 70 && _ < 97)
) {
// do something
}
请确保您不使用 _
来表示无法在 if
语句中丢弃的任何内容:)。 (_=keyCode)
用很少的额外击键来存储值,然后 _
可以在整个过程中使用。 &&
和 ||
评估 left-to-right (reference),因此 _
应该在整个条件的其余部分可用。
我做了一个快速测试:在 Google Chrome,
var x=42;
if((_=x)<99 && _>30) { console.log(x);}
有效(按预期打印 42
)。