2012-01-15 48 views
0

我有一個功能:改進的JavaScript功能

var checkNameLenght = function(name,nameLenght,allowedLenght,defaultName) { 
    if((nameLenght <= allowedLenght) && !(/\s[^a-z]/i.test(name))) { 
     return name; 
    } 
     else { 
      if(opts.debug == true) { 
       console.log(name+' is to long or contains special characters/numbers | Please choose a name shorter than '+allowedLenght+' characters or remove any character/number'); 
      } 
      return defaultName; 
     } 
} 

它所做的,是檢查是否一定的字符串是大於或小於允許的長度,它還會檢查如果字符串包含任何特殊字符或數字(空格除外),如果上述任何一個被確認,它將返回一個默認字符串,如果不是字符串。

但是這個函數同時檢查長度和正則表達式,if((nameLenght <= allowedLenght) && !(/\s[^a-z]/i.test(name))) { ... },但我不想那樣,我想先檢查長度然後再檢查正則表達式。

我想是這樣的:

var checkNameLenght = function(name,nameLenght,allowedLenght,defaultName) { 
    if(nameLenght <= allowedLenght) { 
     return name; 
    } 
     else if(!(/\s[^a-z]/i.test(name))){ 
      return name; 

     } 
      else { 
      if(opts.debug == true) { 
       console.log(name+' is to long or contains special characters/numbers | Please choose a name shorter than '+allowedLenght+' characters or remove any character/number'); 
      } 
      return defaultName; 
      } 
} 

但這並不作爲第一個版本。我在做什麼錯誤的第二個功能?

+0

順便說一句,它是'長度',而不是'長度'。 – 2012-01-15 12:16:49

+0

我知道:)我已經提到了十幾次:D – Roland 2012-01-15 12:18:37

回答

4

但這並不作爲第一個版本

哦,不,你已經改變了邏輯工作。你沒有說第二個版本的工作方式究竟有什麼問題(或者是否給了你一個錯誤?),所以很難說出什麼是錯誤的。但我會猜測。

在第二個版本中,你首先檢查長度,如果該測試通過你立即返回name沒有做任何進一步的測試。如果您還需要測試正則表達式,則可以使用第一個版本中的&&語法,或者將第二個測試嵌套在第一個if塊中。

它還檢查字符串是否包含任何特殊字符或數字(除了空格),如果上面的任何一個被確認,它將返回一個默認字符串,如果不是字符串。

其實這不是你正在做的正則表達式。這是你的:

!(/\s[^a-z]/i.test(name)) 

該正則表達式是測試name是否包含空格字符後面緊跟任何非字母字符,再使結果具有不!適用於它。因此,如果您的字符串包含非字母字符,不會立即跟隨空格,則不會找到它們。如果你的目標是測試,是不是無論是字母AZ或空白的任何字符,任何地方的字符串,然後試試這個:

!(/[^a-z\s]/i.test(name)) 

或代替尋找無效字符只是測試,整個字符串是由有效字符:

/^[a-z\s]*$/i.test(name)   // note: you don't need the ! for this 

//^  - match beginning of string 
// [a-z\s]* - match zero or more alphabet or white space characters 
// $  - match end of string 

而且,你不需要nameLenght參數,因爲串都內置有length屬性:你可以同name.length。 (這不會停止功能的工作,顯然,但它是有點不整潔。)

(你也拼錯了「長度」,但你似乎已經在每個變量名一致,所以它不是'牛逼導致問題至今)

編輯:。新版本的工作,按您的評論:

var checkName = function(name, allowedLength, defaultName) { 
     if(name.length > allowedLength) { 
      console.log("Name is more than allowed length"); 
      return defaultName; 
     } 
     if(/[^a-z\s]/i.test(name)){ 
      console.log("Name contains special characters or numbers"); 
      return defaultName; 
     } 

     // tests passed 
     return name; 
}; 

注意:你不需要任何else語句,因爲每個if返回該功能的。很明顯,您可以刪除我輸入的console.log()聲明,或者您可以添加if(opt.debug)聲明,如原文中的聲明。

+0

感謝您的正則表達式,我沒有經常使用它,所以我不知道太多。那麼,函數的第二個版本的目的是:首先檢查名稱是否超過名稱的允許長度,以及是否返回默認名稱,然後檢查名稱中是否有任何特殊字符或數字如果它返回默認名稱,如果不返回名稱,並且名稱的長度不超過允許的長度,則返回名稱。希望我清楚......:| – Roland 2012-01-15 12:17:59

+0

好的,我編輯了我的答案的結尾,以反映您在評論中所說的內容。但是,函數返回的最終結果與第一個函數完全相同(或者,如果您在函數中修復了正則表達式)。使用這種新方法的唯一好處是,如果您想單獨記錄名稱是否過長或字符無效 - 儘管實際上使用的是您的評論中描述的邏輯,並且在我的答案中顯示,它甚至不會測試無效字符如果名字太長。 – nnnnnn 2012-01-15 12:32:22

+0

這是對的,我想爲每個遇到的情況提供一個單獨的控制檯消息。我測試了它,它工作正常。謝謝:) – Roland 2012-01-15 13:59:57

1

首先,你並不真正需要的else那裏,如果你的第一個條件是true,該函數將返回name和停止,所以第一個改善將是:

var checkNameLenght = function(name,nameLenght,allowedLenght,defaultName) { 
    if((nameLenght <= allowedLenght) && !(/\s[^a-z]/i.test(name))) { 
     return name; 
    } 

    if(opts.debug == true) { 
     console.log(name+' is to long or contains special characters/numbers | Please choose a name shorter than '+allowedLenght+' characters or remove any character/number'); 
    } 
    return defaultName;  
} 

現在,你想首先檢查長度,你需要做的是這樣的:

var checkNameLenght = function(name,nameLenght,allowedLenght,defaultName) { 
    if(nameLenght <= allowedLenght) { 
     if(!(/\s[^a-z]/i.test(name))) { 
      return name; 
     } 
    } 

    if(opts.debug == true) { 
     console.log(name+' is to long or contains special characters/numbers | Please choose a name shorter than '+allowedLenght+' characters or remove any character/number'); 
    } 
    return defaultName;  
} 

目前尚不清楚是否要else僅被執行時nameLength較大或者當正則表達式matche因此您可能需要相應地編輯我的代碼。

1

運用一些想法NNNNNN,我想你的意思是這樣

var checkName = function(name, allowedLength, defaultName) { 
     if (name.length > allowedLength) { 
      if (opts.debug == true) { 
       console.log(name + ' is to long | Please choose a name up to ' + allowedLength + ' characters'); 
      } 
      return defaultName; 
     } 
     else if (/[^a-z\s]/i.test(name)) { 
      if (opts.debug == true) { 
       console.log(name + ' contains special characters or numbers | Please remove any character or number'); 
      } 
      return defaultName; 
     } 
     else { 
      return name; 
     } 
    } 
+0

+1,我即將回答類似的問題(雖然沒有多餘的「else if」和「else」)。 :-) – PPvG 2012-01-15 12:33:20

+0

@PPvG和@Soufiane:你的'else'語句有什麼問題?我強烈反對:忽略它們並沒有獲得任何效率,它們將一組涵蓋所有涉及驗證的案例的測試組合在一起,如果它們被分割爲多個「if」語句,那麼它並不明顯。 – Borodin 2012-01-15 12:58:18

+0

爲了提高效率(因爲顯然沒有收益),我不會忽略它們,但是爲了可讀性。我想這是個人偏好,但我發現'如果A,返回a','如果B,返回b','返回c'更容易閱讀。 – PPvG 2012-01-15 13:05:31

1

你的第一種方法是正確的。它不會在JavaScript中的檢查同時

& & B工作如下

  1. 給出首先它會檢查條件A
  2. 如果A是假的就會去別的條件
  3. 如果A是真的它會檢查條件B
  4. 如果B是假它會去其他條件
  5. 如果B也是如此,它將執行內部的語句如果

所以你的第一種方法是正確的。 像@nnnnnn說的問題是與正則表達式和條件。 作爲兩個條件必須是真實的,它應該是

if(name.length <= allowedLength && /^[a-z\s]*$/i.test(name)) { 
    return name; 
}else{ 
    .... 
} 

如果你給

if(nameLenght <= allowedLenght) { 
    return name; 
}else if(!(/\s[^a-z]/i.test(name))){ 
    return name; 
} 
else { 
    .... 
} 

當任的前兩個條件爲真,則返回name,這是不是您的要求。