在javascript中检查单个if语句中的多个OR条件的更好方法

时间:2017-03-17 10:33:30

标签: javascript

是否可以进一步简化以下javascript声明。要求是如果任何输入是否定的,它应该在块内执行语句。我想知道我是否可以多次避免< 0并且只使用一次

    if (Number(cash.value) < 0 || Number(cheque.value) < 0 || Number(charge.value) < 0 || Number(card.value) < 0) {
doSomething();
}

我简化为这个逻辑

if ((Number(Cash.value) || Number(Cheque.value) || Number(Charge.value) || Number(Card.value)) < 0)

但它不起作用且不符合要求。上述逻辑有效但有重复的&lt; 0逻辑

5 个答案:

答案 0 :(得分:6)

您可以尝试这样做

var numbers = [Cash.value, Cheque.value, Charge.value, Card.value];

if(numbers.some(value => Number(value) < 0)){
   doSomething();
}

例如,正在 ES6

中工作

var numbers = [11, 12, -1,-7];

if(numbers.some(value => value < 0)){
   console.log('Found !!!');
}

对于 IE 9 ,您可以编写一个函数并使用

function anyNegative(numbers){
  for(var i = 0; i < numbers.length; i++){
     if(numbers[i] < 0){
        return true;
     }
  }
  
  return false;
}

var numbers = [11, 12, -1,-7];

if(anyNegative(numbers)){
     console.log('Found !!!');
}

答案 1 :(得分:2)

您可以简化删除,例如Number() - +符号将包含数字的字符串转换为实际数字,我们仍然可以使用更快的逻辑操作数:

if (+cash.value < 0 || +cheque.value < 0 || +charge.value < 0 || +card.value) < 0) {
  doSomething();
}

关于第二行的问题 -

此行不起作用的原因(除了可能的拼写错误,因为JavaScript区分大小写):

if ((Number(Cash.value) || Number(Cheque.value) || Number(Charge.value) || Number(Card.value)) < 0)

是将此Number(Cash.value)转换为布尔值,即。如果值为0则为false,则其他任何内容都将转换为true。因此,如果数字不为0,加号或减号,它们将通过,除了最后一次只按预期通过的测试。每个值都必须单独测试。

建议:除非您需要并行检查多个值,否则请避免使用数组(无论是ES6还是更早版本)。这比直接进行布尔检查要慢得多,特别是在解析并且没有JavaScript优化的旧浏览器中。

答案 2 :(得分:0)

怎么样:

if([Cash,Cheque,Charge,Card].some(obj => Number(obj.value) < 0)) {
    doSomething();
}

答案 3 :(得分:0)

或者将它作为一个功能,以防你在更多的地方需要它。需要N个输入来验证

https://jsfiddle.net/2L1L7ncj/

function isAnyArgumentNegative(){
    var args = Array.prototype.slice.call(arguments);
  return args.some(function(a){
    return Number(a) < 0;
  });
}

答案 4 :(得分:0)

我想,不是真的。

你的第二个陈述不起作用,因为你基本上检查所有的值 - 除了最后一个 - 是真实的,然后只有最后一个是否定的。

如果要使代码更具可读性,可以添加辅助函数:

protected async Task<T> ParseJson<T>(HttpResponseMessage response) =>
    JsonConvert.DeserializeObject<T>(await response.Content.ReadAsStringAsync(), Settings);

然后在你的if语句中使用它。

从技术上讲,你可以制作这样的函数:

function isNegative(value) {
  return Number(value) < 0;
}

但我认为第一个选择会提供更好的代码。