2013-08-06 93 views
0

我有一个if语句看起来像这样:如何检查多个值和if语句中匹配的值?

if ("Bolagsmän" in nicerows){ 
     var contact = this.makeContact(nicerows['Bolagsmän'],true); 
    } 
    else if ("Komplementär(er)" in nicerows){ 
     var contact = this.makeContact(nicerows['Komplementär(er)'],true); 
    } 
    else if("Innehavare" in nicerows){ 
     var contact = this.makeContact(nicerows['Innehavare'],false); 
    } 
    else if("Styrelseledamot, verkställande direktör" in nicerows){ 
     var contact = this.makeContact(nicerows['Styrelseledamot, verkställande direktör'], true); 
    } 
    else if("Styrelseledamöter" in nicerows){ 
     var contact = this.makeContact(nicerows['Styrelseledamöter'], true); 
    } 

正如你可以看到它是很多代码乘法的,只是因为有几个可能的变量。有没有更干净的方法来做到这一点?

+0

您是否期望只有其中一个发生?然后你可以在'nicerows'上使用for-in循环。 – Bergi

+0

是的,只有其中一个。 – Himmators

+0

请参阅http://stackoverflow.com/questions/3982721/javascript-getting-a-single-property-name然后 – Bergi

回答

6

你可以使用一个循环,无论是现代化的一个:

var names = ["Bolagsmän", "Komplementär(er)", "Innehavare", "Styrelseledamot, verkställande direktör", "Styrelseledamöter"]; 
var contact; 
names.some(function(name) 
{ 
    if (name in nicerows) 
    { 
     contact = this.makeContact(nicerows[name], name !== 'Innehavare'); 
     return true; // Breaks the loop 
    } 
}); 

或者无聊的老种:

var names = ["Bolagsmän", "Komplementär(er)", "Innehavare", "Styrelseledamot, verkställande direktör", "Styrelseledamöter"]; 
var contact; 
var index, name; 
for (index = 0; index < names.length; ++index) 
{ 
    name = names[index]; 
    if (name in nicerows) 
    { 
     contact = this.makeContact(nicerows[name], name !== 'Innehavare'); 
     break; 
    } 
} 

或者可能把标志的地图:

var names = { 
    "Bolagsmän":        true, 
    "Komplementär(er)":      true, 
    "Innehavare":        false, 
    "Styrelseledamot, verkställande direktör": true, 
    "Styrelseledamöter":      true 
}; 
var name; 
var contact; 
for (name in names) 
{ 
    if (name in nicerows) 
    { 
     contact = this.makeContact(nicerows[name], names[name]); 
     // Note use of flag -----------------------^ 
     break; 
    } 
} 
+0

你为什么在这里使用'.some'?你没有使用返回值。 –

+0

@BenjaminGruenbaum:所以我可以停止循环。疯狂地说,'forEach'不能提供这样做的方法。 –

+0

知道了,我不知道'.some'对互动顺序有一个保证,+1对于教给我一些东西。如果只有我们有很好的ES6支持:)'var name = names.find(name => name in nicerows); contact = this.makeContact(nicerows [name],name!==“Innehavare”);' –

0

这样的事情呢?

var words = {"Bolagsmän": true, "Komplementär(er)": true, "Innehavare": false, "Styrelseledamot, verkställande direktör": true, "Styrelseledamöter": true}; 

for(var word in words) { 
    if(words.hasOwnProperty(word)) { 
     if(word in nicerows) { 
      var contact = this.makeContact(word, words[word]); 
      break; 
     } 
    } 
} 
+2

我认为这对'Innehavare'(不正确的第二个参数) –

+0

Woops,只是注意到并不是所有的单词屈服TRUE;。更新了代码以解决这些问题。 – Nadh

0

当o中只有一个属性时无论如何,没有理由列出并尝试所有可能的名称。

for (var name in nicerows) 
    var contact = this.makeContact(nicerows[name], name!='Innehavare'); 
    // break; - not even necessary