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 +="'"; } |