2013-12-10 86 views
0

我不是很擅長編程,但我總是盡我所能。在下面的代碼中,你會看到很多重複。我試圖縮短它,但我認爲它保持非常難看。有很多重複的簡短代碼

我該如何改進這一點,使其重複性更低?

var values = ["A", "B", "T", "D", "DD"]; 
for(var i = 0; i < values.length; i++) { 
    var len = values[i].length + 1; 
    if(q.substr(0, len) == values[i] + ";"){ 
     $("#imagedocu_art").val(values[i]); 
     $("#imagedocu_text").val(q.substr(len)); 
     $("#new_imagedocu").submit(); 
     break; 
    } 
} 

或者你可以使用查詢:

$("#searchterm").keyup(function(e){ 
    var q = $("#searchterm").val(); 

    if(e.keyCode==13){ 
     if(q.substr(0,2) == "A;"){ 
      $("#imagedocu_art").val("A"); 
      $("#imagedocu_text").val(q.substr(2)) 
      $("#new_imagedocu").submit();   
     } 
     if(q.substr(0,2) == "B;"){ 
      $("#imagedocu_art").val("B"); 
      $("#imagedocu_text").val(q.substr(2)) 
      $("#new_imagedocu").submit();   
     } 
     if(q.substr(0,2) == "T;"){ 
      $("#imagedocu_art").val("T"); 
      $("#imagedocu_text").val(q.substr(2)) 
      $("#new_imagedocu").submit();   
     } 
     if(q.substr(0,2) == "D;"){ 
      $("#imagedocu_art").val("D"); 
      $("#imagedocu_text").val(q.substr(2)) 
      $("#new_imagedocu").submit();   
     } 
     if(q.substr(0,3) == "DD;"){ 
      $("#imagedocu_art").val("DD"); 
      $("#imagedocu_text").val(q.substr(3)) 
      $("#new_imagedocu").submit();   
     } 
    } 


    if((q.substr(0,2) == "D;") || (q.substr(0,3) == "DD;")){ 
    if(q.substr(0,2) == "D;"){ 
     var text = q.substr(2); 
    }else{ 
     var text = q.substr(3); 
    } 
+0

它的樣式的所有問題。您可能需要考慮添加更多詳細信息。 'q'的期望值看起來有一個特定的格式。 2或3個字母,後跟一個分號,後跟一些更多的字符放入imagedocu_text輸入中。但是列舉的q值是什麼?這段代碼有什麼要求? – codefactor

+0

好的需求是檢查輸入的值,然後修改它!但這只是一個片段!謝謝 –

回答

2

你可以像這樣的東西取代您的第一if

var values = { A: 1, B: 1, T: 1, D: 1, DD: 1 }; 
var parts = q.split(/;(.*)/, 2); 
if(parts[0] in values){ 
    $("#imagedocu_art").val(parts[0]); 
    $("#imagedocu_text").val(parts[1]); 
    $("#new_imagedocu").submit(); 
} 

事實上你的整個方法可以用什麼來代替像這樣:

var q = $("#searchterm").val(); 
var values = { A: false, B: false, T: false, D: true, DD: true }; 

var parts = q.split(/;(.*)/, 2); 

if(e.keyCode==13){ 
    if(parts[0] in values){ 
     $("#imagedocu_art").val(parts[0]); 
     $("#imagedocu_text").val(parts[1]); 
     $("#new_imagedocu").submit(); 
    } 
} 

if(parts[0] in values && values[parts[0]]){ 
    var text = parts[1]; 
} 
+0

在你的第二個代碼中你有'q.split(「;」,2);'但是這樣可以和DD一起工作嗎?謝謝 –

+0

@JohnSmith是的,它的確如此。 –

+1

@JohnSmith其實我剛剛意識到,如果你可能在你的字符串中的第一個字符串之後有''',你應該使用'q.split(/;(.*)/,2)'代替。我相應地更新了我的答案。 –

4

正則表達式可以替代所有if檢查。

if (e.keyCode==13) { 
    var match = q.match(/^([ABTD]|DD);(.*)/); 
    if (match) { 
     $("#imagedocu_art").val(match[1]); 
     $("#imagedocu_text").val(match[2]); 
     $("#new_imagedocu").submit();   
    } 
} 

REG EXP

/  Start of reg exp 
^  Start of string 
(  Start of capture group 
[ABTD] Match any character included inside the [] 
|  OR 
DD  Match the String "DD" 
)  End of capture group 
;  Match a semicolon 
(.*) Match all the remaining 
/  End of Reg Exp 

的基本解釋這場比賽將變成

null or ["A;FOO", "A", "FOO"] or ["DD;FOO", "D", "FOO"] 
+1

#imagedocu_text的值我認爲需要在分號後加q的子字符串,可能會考慮使用'/ ^([ABTD] | DD);(。*)$ /',然後使用match [2]作爲值的文字。 – codefactor

+0

啊,誤解了原來的代碼!做出改變! – epascarello