使用JavaScript中的多个和/或选项缩短if条件

时间:2017-06-14 10:30:38

标签: javascript

我有一段代码(我认为这是非常低效和糟糕的;但我可能错了。),检查变量是否在其他变量确定的范围内,如此;

if ((a >= (x.eq(0) && y.eq(0)) || (a >= x.eq(1) && y.eq(1)) ... || (a >= x.eq(n) && y.eq(n)))) {
    // code here
}

(我可能在问题中得到了错误的括号,但代码本身也有效。)

其中n是数组x和y中的数字总数。显然,if条件看起来非常非常大,我认为它没有被优化和“坏”。 有什么我可以用来缩短病情吗?如果上面的块是不可读的,我想要的伪代码:

  

检查a是否介于x(0)和y(0)之间   如果是真的,做事   否则检查a是否在x(1)和y(1)之间   如果是真的,做事   否则检查......如果a在x(n)和y(n)之间   如果是真的,做事   否则什么都不做。

3 个答案:

答案 0 :(得分:1)

您可以使用for循环并在满足一个条件时退出。您需要对具有a和左右边界的范围chekc使用正确的比较。

var i;
for (i = 0; i <= n; i++) {
    if (x.eq(i) <= a && a <= y.eq(i)) {
        // do something
        break;
    }
}

假设您有两个具有相应长度的数组,或者只有一个具有xy属性的对象,您可以使用Array#some

array.some(function (o, i) {
    if (o.x <= a && a <= o.y) {
        // do something
        // update(o, i);
        return true;      // exit iteration
    }
});

答案 1 :(得分:1)

您可以创建一个可重复使用的函数,该函数可以生成一系列数字并检查您的条件是否满足:

&#13;
&#13;
// usage: 
//  isBetweenAny
//      (0,10) // start and end of range
//      (x, y) // functions, in your case in question pass x.eq and y.eq
//      (a) // your 'a' value
// returns true or false

const isBetweenAny = (startNum, endNum) => (x, y) => a => 
  [...Array(endNum + 1).keys()].slice(startNum) // range of numbers (inclusive)
    .some(num => (a >= x(num) && a <= y(num))) // if any number satisfies the condition

// identity function - for easy testing
const map = x => x;

const res1 = isBetweenAny(1, 10)(map, map)(1) // true: 1 in [0...10] range
const res2 = isBetweenAny(2, 10)(map, map)(1) // false: 1 not in [2...10] range

console.log(res1, res2)
&#13;
&#13;
&#13;

然后你也可以像这样使用它:

const mySpecificCase = isBetweenAny(0, 100)(x.eq, y.eq) // new function for your specific case

if (mySpecificCase(a)) {
 ....
}

答案 2 :(得分:0)

你想要这样的东西吗?

// try every number between 0 and n
for (var i = 0; i++, i < n) {
  // generic version of your condition
  if (a >= (x.eq(i) && y.eq(i)) {
    // do the things
    break; // break the loop so the things are only done once
  }
}