2012-01-15 53 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,这是不是您的要求。