多个'如果'声明?

时间:2014-03-20 03:54:04

标签: javascript math if-statement formula

假设我有一个功能 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;
}

(以上给出的例子是假设的)

我使用的功能完全有效,但是:

  • 是否有更好的方法或程序或公式来替换它?(它不必是这么长或丑陋)

感谢名单!

3 个答案:

答案 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部分有一个错误。)第三,您对time1time2进行了隐式比较,因此请明确说明。

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 = 10time2 = 10,则无法匹配。当你重复自己时,很容易错过这种类型的错误。为每个条件指定下限和上限是不必要的重复。由于我看不到边界的模式(可以委托给一个函数),我只是将下限放入一个数组中并确保它按降序排序,以便循环可以在第一次匹配后停止。