如何使这个大的if语句在JavaScript中更具可读性

时间:2011-11-30 11:28:08

标签: javascript

我需要在JavaScript中使以下大if语句更具可读性。

有什么想法吗?

if ( Tools.Array.contains( that.pAutocompleteAliasUsed[i], this.currentString) !== false  &&
    ( this.autocomplete.list.length === 0 ) || ( this.currentString.toLowerCase() !== this.autocomplete.list[0].target.alias.toLowerCase() ) )
{
    make something
}

5 个答案:

答案 0 :(得分:3)

 if( Tools.Array.contains( that.pAutocompleteAliasUsed[i], this.currentString) !== false  &&
        ( this.autocomplete.list.length === 0 ) || 
        ( this.currentString.toLowerCase() !== this.autocomplete.list[0].target.alias.toLowerCase() )
   )
 {
          // something
 }

答案 1 :(得分:3)

要使事情更具可读性,您可以做的一件事是从if语句中提取各种逻辑测试。在if测试中读取单个语句然后很好地命名布尔参数要容易得多。

我已经为这个例子中的第一个测试做了这个,我已经和其他人一起去了,但你知道他们正在测试什么,你可以比我更好地命名。

var toolsContainsString = Tools.Array.contains(that.pAutocompleteAliasUsed[i], this.currentString) !== false;
var isAutoCompleteEmpty = this.autocomplete.list.length === 0;
var isTargetMatch = this.currentString.toLowerCase() !== this.autocomplete.list[0].target.alias.toLowerCase();

if (toolsContainsString && (isAutoCompleteEmpty || isTargetMatch)) {
    //make something
}

答案 2 :(得分:3)

当您进行复杂测试时,最好(1)在明确定义的函数中提取部分测试,以及(2)为这些函数提供良好的名称,以解释函数的用途。

通过这种方式,只需读取方法名称即可了解函数正在执行和返回的内容。

 if (isAutoCompleteAliasUsed(i, currentString) 
          && notEmptyOrFirst(this.autocomplete, currentString){
     // make something
 }

 function isAutoCompleteAliasUsed(index, currentString){
     return Tools.Array.contains(that.pAutocompleteAliasUsed[i], currentString);
 }

 function notEmptyOrFirst(autocomplete,currentString){
     return autocomplete.list.length === 0 
        || (currentString.toLowerCase() !== autocomplete.list[0].target.alias.toLowerCase() );
 }

答案 3 :(得分:2)

你不能真正缩短它,因为你有各种各样的变量。但你可以做的就是这样,这使它更具可读性:

var list = this.autocomplete.list,
    currentString = this.currentString,
    containsCurrentString = Tools.Array.contains( that.pAutocompleteAliasUsed[i], currentString);

if ( containsCurrentString !== false  &&
        ( list.length === 0 ) || ( currentString.toLowerCase() !== list[0].target.alias.toLowerCase() ) )
{
    // make something
}

答案 4 :(得分:1)

var bListEmpty  = !!this.autocomplete.list.length,
    sCurrent = this.currentString.toLowerCase(),
    sTarget  = this.autocomplete.list[0].target.alias.toLowerCase(),
    bContains   = Tools.Array.contains(that.pAutocompleteAliasUsed[i], this.currentString),
    bSameString = (sCurrent === sTarget);

if (bContains && bListEmpty || bSameString) {
    // do something
}

if (Tools.Array.contains( that.pAutocompleteAliasUsed[i], this.currentString) !== false 
        && this.autocomplete.list.length === 0
        || this.currentString.toLowerCase() !== this.autocomplete.list[0].target.alias.toLowerCase())
{
    // do something
}