我有一段代码(我认为这是非常低效和糟糕的;但我可能错了。),检查变量是否在其他变量确定的范围内,如此;
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)之间 如果是真的,做事 否则什么都不做。
答案 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;
}
}
假设您有两个具有相应长度的数组,或者只有一个具有x
和y
属性的对象,您可以使用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)
您可以创建一个可重复使用的函数,该函数可以生成一系列数字并检查您的条件是否满足:
// 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;
然后你也可以像这样使用它:
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
}
}