假设我有一个功能 checkTime ,就像下面那个我必须同时检查多个条件的那个。
var result=0;
function checkTime(time1, time2) {
if (time1 >= 0 && time2 <= 0) {
result = 1;
}
else if (time1 >= 0 && time2 <= 1) {
result = 4;
}
else if (time1 >= 2 && time2 <= 3) {
result = 5;
}
else if (time1 >= 4 && time2 <= 6) {
result = 6;
}
else if (time1 >= 7 && time2 <= 9) {
result = 7;
}
else if (time1 >= 11 && time2 <= 12) {
result = 8;
}
else if (time1 >= 13 && time2 <= 15) {
result = 9;
}
else if (time1 >= 16 && time2 <= 17) {
result = 10;
}
else if (time1 >= 19 && time2 <= 20) {
result = 11;
}
return result;
}
(以上给出的例子是假设的)
我使用的功能完全有效,但是:
感谢名单!
答案 0 :(得分:3)
您可以使用数组来表示所有组合:
tests = [
{ time1: 0, time2: 0, result: 1 },
{ time1: 0: time2: 1, result: 4 },
...
];
for (var i = 0; i < tests.length; i++) {
if (time1 >= tests[i].time1 && time2 <= tests[i].time2) {
return tests[i].result;
}
}
答案 1 :(得分:0)
如果代码相同,只有值发生变化,您可以执行以下操作:
function checkTime(time1, time2) {
[
[0, 0, 0],
[0, 1, 0]
].forEach(function (it) {
if (time1 >= it[0] && time2 <= it[1]) {
return it[2];
}
});
}
答案 2 :(得分:0)
嗯,首先你有可能会得到一个未定义的结果,所以这会让事情变得模棱两可。 result
应该从0
开始吗?这是一个重要的细节。其次,您似乎正在使用边界,因此有必要将<=
更改为<
以使其更清晰。 (如果是这样,7-9 / 11-12部分有一个错误。)第三,您对time1
和time2
进行了隐式比较,因此请明确说明。
var result = 0;
var diff = time2 - time1;
var bounds = [21, 19, 16, 13, 11, 7, 4, 2, 0];
if (diff <= 0) result = 0; // unexpected outcome
else
for (position = 1; position < bounds.length; ++position) {
if (time1 >= bounds[position]) {
if (time2 < bounds[position - 1]) {
result = 3 + (bounds.size - position);
}
break;
}
}
return result;
其他实现是可能的,但很难根据您的问题准确判断您正在解决的问题。
<强>后续强>
这段代码有一个空白:
else if (time1 >= 7 && time2 <= 9) {
result = 7;
}
else if (time1 >= 11 && time2 <= 12) {
result = 8;
}
如果time = 10
和time2 = 10
,则无法匹配。当你重复自己时,很容易错过这种类型的错误。为每个条件指定下限和上限是不必要的重复。由于我看不到边界的模式(可以委托给一个函数),我只是将下限放入一个数组中并确保它按降序排序,以便循环可以在第一次匹配后停止。