我已经定义了多个区间 [0, 20[,[20, 70[, [70, 200[, [200, 500[, [500, 10000[, [1000, infinity[。对于给定的 x 的 value,我们在 [0,1,2,3,4,5] 中得到一个 value y,其中 [0, 20[ 对应于 0 等...基本解决方案是使用 if 语句喜欢:
if (x>=0 && x<20){
y = 0
}
if (x>=20 && x<70){
y = 1
}
.
.
.
此任务是否有其他解决方案(更少代码)?我在nodejs中使用这段代码
回答1
使用 else if
,那么你不需要检查下限,因为之前的检查已经处理了。
if (x < 20) {
y = 0;
} else if (x < 70) {
y = 1;
} ...
或者您可以将限制放在一个数组中,然后循环直到超过限制。
const limits = [20, 70, 200, ...];
let y;
for (y = 0; y < limits.length && x < limits[y]; y++) {};
回答2
你可以使用这样的逻辑:
const intervals = [
{ from: 0, to: 20},
{ from: 20, to: 70},
{ from: 70, to: 200},
{ from: 200, to: 500},
{ from: 500, to: 1000},
{ from: 1000, to: Number.POSITIVE_INFINITY}
];
function findInterval(x) {
for (let i in intervals) {
if (x >= intervals[i].from && x < intervals[i].to) {
return i;
}
}
throw new Error('Argument not within intervals');
}
// test:
const testvalues = [5, 21, 90, 345, 878, 9234802];
for (let x of testvalues) {
console.log(`interval of ${x}: ` + findInterval(x));
}
// output:
interval of 5: 0
interval of 21: 1
interval of 90: 2
interval of 345: 3
interval of 878: 4
interval of 9234802: 5
回答3
你可以试试这个
const ranges = [
[0, 20],
[20, 70],
[70, 200],
[200, 500],
[500, 10000],
[1000, Infinity]
];
function getIntersectionIndex(x) {
for (let i = 0; i < ranges.length; i++) {
if (ranges[i][0] <= x && x < ranges[i][1])
return i;
}
return -1;
}
const y = getIntersectionIndex(10); // returns 0