关于javascript:将特定的if / else if / else转换为switch

Converting a specific if/else if/else to switch

我在这里有点挣扎,所以我可以使用一些外部的意见。为了完成某件事,我必须快速(而且杂乱无章)地编写一个包含if/else语句的函数,但现在我有更多的时间花在它上面,我想把它转换成一个开关。这件事让我绞尽脑汁,但我似乎不明白。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// This is just the function, this is fine as it is.
var between ="...";
var val = x.value.split("&&")
    val.forEach(function(y){
        application.output(y)
        if(y.search("{")!=-1.0) {
            y=y.substring(1,y.length)
        } else {
            if(y.search("}")!=-1.0){
            y=y.substring(0,y.length-1)
            }
        }

// Below is what Im trying to build a switch out of
if(y.search("!")!=-1.0) {

            if(y.search("%")!=-1.0) {
                y=" NOT LIKE '"+y.substring(1,y.length)+"'"
            } else if(y.search(">") !=-1.0) {
                y=" !> '"+y.substring(2,y.length)+"'"
            } else if(y.search("<") !=-1.0) {
                y=" !< '"+y.substring(2,y.length)+"'"
            } else if(y.search("...")!=-1.0) {
                // Use the index & final index of between to slice the two values apart
                y=" NOT BETWEEN '"+y.substring(1,y.indexOf(between))+"'"+" AND '"+y.substring(y.lastIndexOf(between)+3,y.length)+"'"
            } else {
                y=" != '"+y.substring(1,y.length)+"'"
            }
        // If user is inputting operators  
        } else if (y.search(">") !=-1.0) {
            y ="> '"+y.substring(1,y.length)+"'"
        } else if (y.search("<") !=-1.0) {
            y =" < '"+y.substring(1,y.length)+"'"
        } else if (y.search("...")!=-1.0) {
            y=" BETWEEN '"+y.substring(1,y.indexOf(between))+"'"+" AND '"+y.substring(y.lastIndexOf(between)+5,y.length)+"'"
        } else {
            if(y.search("%")!=-1.0) {
                y=" LIKE '"+y+"'"
            } else {
                y=" = '"+y+"'"
            }
        }
        y=" and"+x.name.toString()+""+y
        sql+=y

该函数接受通过用户输入传入的运算符,并从中生成SQL查询。甚至不确定是否可以将其转换为开关,但很可能有一种方法。


我想这个代码可以。

如果是我的……我只需要替换一些东西:

  • indexOf > -1代替search != -1.0。请参阅为什么搜索->indexof,("!=1.0->>-1"表示可读性)
  • 在每条语句的末尾使用;
  • 默认情况下,substring中的第二个参数已经是字符串长度,您可以删除它。

但这是一个品味的问题,在你的代码中保持标准。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    application.output(y);
    if (y.indexOf("{") > -1) {
        y = y.substring(1);
    }
    if (y.indexOf("}") > -1) {
        y = y.substring(0, y.length - 1);
    }

    // Below is what Im trying to build a switch out of
    if (y.indexOf("!") > -1) {

        if (y.indexOf("%") > -1) {
            y =" NOT LIKE '" + y.substring(1) +"'";
        } else if (y.indexOf(">") > -1) {
            y =" !> '" + y.substring(2) +"'";
        } else if (y.indexOf("<") > -1) {
            y =" !< '" + y.substring(2) +"'";
        } else if (y.indexOf("...") > -1) {
            // Use the index & final index of between to slice the two values apart
            y =" NOT BETWEEN '" + y.substring(1, y.indexOf(between)) +"'" +" AND '" + y.substring(y.lastIndexOf(between) + 3) +"'";
        } else {
            y =" != '" + y.substring(1) +"'";
        }
        // If user is inputting operators  
    } else if (y.indexOf(">") > -1) {
        y ="> '" + y.substring(1) +"'";
    } else if (y.indexOf("<") > -1) {
        y =" < '" + y.substring(1) +"'";
    } else if (y.indexOf("...") > -1) {
        y =" BETWEEN '" + y.substring(1, y.indexOf(between)) +"'" +" AND '" + y.substring(y.lastIndexOf(between) + 5) +"'";
    } else if (y.indexOf("%") > -1) {
        y =" LIKE '" + y +"'";
    } else {
        y =" = '" + y +"'";
    }

    y =" AND" + x.name.toString() +"" + y;
    sql += y;


您可以尝试使用map和switch case组合,但是imo最好删除所有重复出现的代码段,并且只保留其中的一个,同时将许多字符串连接在一起,最好在单独的行中这样做,这样可以提高可读性。

示例…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function checkChar(c) {
    return y.search(c) != -1.0;
}

var len = y.length;

if (checkChar("!")) {

    if (checkChar("%")) y =" NOT LIKE '" + y.substring(1, len);
    else if (checkChar(">")) y =" !> '" + y.substring(2, len);
    else if (checkChar("<")) y =" !< '" + y.substring(2, len);
    else if (checkChar("...")) {
        y =" NOT BETWEEN '";
        y += y.substring(1, y.indexOf(between));
        y +="' AND '";
        y += y.substring(y.lastIndexOf(between) + 3, len);
    }
    else y =" != '" + y.substring(1, len);

    y +="'";

}