如果在一个值上声明多个条件而没有重复值

时间:2016-01-27 18:29:55

标签: javascript if-statement conditional

我想知道是否有办法检查同一变量或值的多个条件而不重复该值。

例如,如果我有变量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
}

如您所见,我在keyCode条件下写了if次6次。如果条件更复杂(这个只是排除了所有非十六进制字符),那么它可能会更加重复。

我想知道是否有办法简化这一点。也许是这样的:

if(
    keyCode > 102 || < 48 || (> 57 && < 65) || (> 70 && < 97)
) {
    // do something
}

其中您可以简单地省略变量名称,只需在单个变量上放置许多条件。它与this question相反,其中提问者想知道是否有办法根据单一条件检查多个变量。

我现在正在使用JS进行编码,但如果你知道其他任何语言的实现,那么将来也可能会有所帮助。我以为会有一个简单的实现,因为我经常使用它,但我很惊讶地发现我根本无法找到任何语言功能的任何信息。

5 个答案:

答案 0 :(得分:3)

简化这一点的唯一方法我知道创建具有有意义名称的单独函数,例如:

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)

答案 1 :(得分:2)

没有办法像Sintax那样做明智的事,但你可以做一些事情来试图效仿:

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")
} 

答案 2 :(得分:1)

某些语言(如Python)支持链式比较,因此您可以说42 < x <= y < 84。但是,一般情况下,我个人并不了解您描述的确切功能。不过看起来不错!

对于小型域名,例如密钥代码,您可以将感兴趣的代码放在数组中并测试集合成员资格:

if keyCode in (range(102,256)+range(0,49)+range(58,65)+range(71,97)):
    # do something

+通过将它们全部放在一个列表中来获取范围的并集。)

答案 3 :(得分:1)

不,你不能删除变量,因为每个条件都由它自己评估。 但是为了重用某些检查,我建议你将它们提取到函数对象(并从另一个文件中获取它):

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) ... )

答案 4 :(得分:1)

另一个想法 - 为您的变量使用简短的别名,例如.mobilebtnmenue{ text-align: left; margin-top: -22px; margin-left: 35px; } .mobile{ position: relative; z-index: 50; background: #222; font-family: 'Varela Round', sans-serif; font-size: 17px; display: block; } .pushmenu { display: block; } header{ display:block; height:100px; } body{ width:100%; min-width: 375px; }

_

请确保您不会将if( (_=keyCode) > 102 || _ < 48 || (_ > 57 && _ < 65) || ( _ > 70 && _ < 97) ) { // do something } 用于_语句中无法丢弃的任何内容:)。 if只需很少的额外击键就可以保存该值,然后可以使用(_=keyCode)_&&从左到右(reference)进行评估,因此||应该可以在其余条件下使用_

我做了一个快速测试:在谷歌浏览器中,

var x=42; 
if((_=x)<99 && _>30) { console.log(x);}

有效(按预期打印42)。