2012-05-14 60 views
0

我一直在寫一個JavaScript函數,如果該值匹配大約4個值之一(在下面的例子中只是3)返回true。問題是,當我只有兩個值時,函數可以正常工作,但是添加第三個值會破壞代碼。多個OR運算符與elem.value.match

我對JavaScript很新,我猜這樣做有更好的方法嗎?我試過搜索,但沒有發現任何東西。

任何幫助,非常感謝。

function isValid(elem, helperMsg){ 

       var sn6 = /[sS][nN]6/; 
       var sn5 = /[sS][nN]5/; 
       var sn38 = /[sS][nN]38/; 

       if(elem.value.match(sn6 || sn5 || sn38)){ 
         //do stuff 
         return true; 
       }else{ 

         return false; 
       } 
      } 

編輯:

這裏是我的一個數組第二次嘗試:

function isLocal(elem, helperMsg){ 
     var validPostcodes=new Array(); 
      validPostcodes[0]= /[wW][rR]12/;  
      validPostcodes[1]= /[cC][vV]35/; 
      validPostcodes[2]= /[sS][nN]99/; 
      validPostcodes[3]= /[sS][nN]6/; 
      validPostcodes[4]= /[sS][nN]5/; 
      validPostcodes[5]= /[sS][nN]38/; 
      validPostcodes[6]= /[oO][xX]29/; 
      validPostcodes[7]= /[oO][xX]28/; 

     var i = 0; 

     for (i = 0; i < validPostcodes.length; ++i) { 
      if(elem.value.match(validPostcodes[i])){ 
        // do stuff 
        return true; 
      }else{ 
        alert(helperMsg); 
        elem.focus(); 
        return false; 
      } 
     } 
    } 

回答

4
a || b || c 

是計算結果爲布爾表達式。這意味着您正在運行match(true)match(false)。您必須將它寫爲:

match(a) || match(b) || match(c) 

另一種選擇是將它們存儲在數組中並循環。這意味着如果模式數量增加,則不必更改模式列表以外的代碼。另一種方法,但僅限於這種情況,可能是模式轉變爲一種等同於或-ING的三個選項(未經測試,我有點對正則表達式生鏽):

elem.value.match(/[sSnN][6|5|38]/) 

陣列基於例如:

var patterns = [/../, /.../]; 
for (var i = 0; i < patterns.length; ++i) { 
    if (elem.value.match(patterns[i])) { return true; } 
} 

在實際的代碼,我可能會格式化是這樣的:

function isValid(elem, helperMsg){ 
    var patterns = [/../, /.../], 
     i = 0; 
    for (i = 0; i < patterns.length; ++i) { 
     if (elem.value.match(patterns[i])) { 
      return true; 
     } 
    } 
} 

這只是一種習慣,雖然因爲JavaScript的吊變量,其範圍的頂部。絕不需要像這樣聲明變量。

+0

感謝您的回答,我會再閱讀一些內容並嘗試剖析它。不幸的是,正則表達式的答案不會工作,因爲會有其他的郵編不以sn開頭。 – user319940

+0

啊。在那種情況下,我可能會使用數組方法。如果有什麼特別需要幫助理解,請告訴我,我很樂意編輯我的答案,以便更清楚。 – Corbin

+0

謝謝!我將在接下來的一個小時內嘗試這個功能,所以我一定會讓你知道/接受你的答案。 – user319940