2013-12-16 99 views
1

我想弄清楚如何简化可能的长if else语句。如何缩短长if else语句

有8种可能性可以选择,每个选项1-8我想显示一条消息。

例如,这是什么工作,但我知道可以更好writtern:

if(this.cv == '1'){ 
console.log('Greater Then 1'); 
} else 
if(this.cv == '2'){ 
console.log('Greater Than 2'); 
} 

等...

寻找的东西多一点活力。

+5

这个问题似乎是无关紧要的,因为它是关于代码审查 - ** http://codereview.stackexchange.com/.** – lifetimes

+1

如果您只需要一个一个查找,不需要切换,这比一个LUT慢:console.log({1:'gt one',2:'gt two'} [this.cv]) – dandavis

回答

6

使用地图:

var messages = { 
    '1' : 'Greater than 1', 
    '2' : 'Greater than 2', 
    ....etc 
} 

console.log(messages[this.cv]); 
+0

我不能说更好自己,尽管我试过......为什么在一个开关中运行多个比较,而您可以运行一个名称解析呢? – dandavis

+0

@dandavis在内部,这几乎是'switch'所做的事情,但是用一个语句块而不是一个字符串。 –

+0

开关评估每种情况,例如:switch(true),一个对象不会。如果有疑问的话。 – dandavis

1

您可以使用switch语句,检查此链接for more details

Genaral开关的语法:

switch (expression) { 
    case label1: 
    statements1 
    [break;] 
    case label2: 
    statements2 
    [break;] 
    ... 
    case labelN: 
    statementsN 
    [break;] 
    default: 
    statements_def 
    [break;] 
} 

你的情况:

switch(this.cv) { 
case '1': 
    console.log("Greater than 1"); 
    break; 
case '2': 
    console.log("Greater than 2"); 
    break; 
} 
+1

这不会比一系列if语句短得多。 – j08691

+1

@ j08691虽然书面的代码可能不是,但执行的操作当然是;) –

+0

但是我必须低估这个答案,因为你已经过分复杂了。 '[break;]'...虽然我理解它的意思是“可选的”break;'“,其他人可能不会。 –

2

使用switch语句:

switch(this.cv) 
{ 
case '1': 
    console.log('Greater Than 1'); 
    break; 
case '2': 
    console.log('Greater Than 2'); 
    break; 
default: 
    //executed if no matches are found 
} 

或者根据adeneo的回答,一张地图也可以很好地工作,因为这基本上是一个switch语句的实现。两种压缩几个if语句都是很好的选择。

1

这就是switch声明的原因。

switch(this.cv) { 
case '1': 
    console.log("Greater than 1"); 
    break; 
case '2': 
    console.log("Greater than 2"); 
    break; 
} 

你甚至可以添加一个“包罗万象”默认动作:

default: 
    console.log("I don't know what to do with "+this.cv); 
1
switch(n) 
{ 
case '1': 
    execute code block 1 
    break; 
case '2': 
    execute code block 2 
    break; 
default: 
    code to be executed if n is different from case 1 and 2 
} 
3

如果这是你的消息的确切格式(适用于所有情况下),那么你可以简单的写:

console.log('Greater Than ' + this.cv); 

不过,如果你需要更多的灵活性,每一种情况下,那么你可以使用一个switch声明为其他答案有人建议。

1

我想说创建的可能值映射到消息的对象,并简单地从地图上像这样检索消息:

var messages = {'1': 'Greater Then 1', 
       '2': 'Greater Than 2'}; 
console.log(messages[this.cv]); 
+2

小心,你试图用一个字符值索引数组,而不是一个整数... – Joel

+0

数组通过字符串索引,有什么问题? – dandavis

+0

他们可以......你的编辑也许是更好的做法! – Joel

1

有时取决于我有很多功能添加到各种变量..

在这种情况下,我更喜欢使用类似的东西。 我用答案创建一个对象。然后我检查答案是否存在并执行。 我更喜欢在开关

var a={'2':'greater than 2','1':'greater than 1'} 
console.log(a[this.cv]?a[this.cv]:'') 

另一种方式来写,这是

var a={'2':'greater than 2','1':'greater than 1'} 
!a[this.cv]||(console.log(a[this.cv])); 

,或者如果你只是做一个简短检查使用JavaScript的简写。

console.log('Greater then '+(a=this.cv,a==1)?1:(a==2)?2:'whatever'); 

console.log('Greater then '+(this.cv==1?1:2)); 

,并在你的情况下,

console.log('Greater than '+this.cv); 

应该够了。