如何将以下内容转换为if语句?

时间:2013-11-19 19:22:25

标签: javascript

所以我在支持API的虚拟桌面上播放RPG。我不想单独创建一堆对象,所以我正在使用API​​,并希望从JSON转储中读取属性,然后将这些属性写入游戏中的对象(Character)。因此,只要我提取静态信息,我的代码一切顺利。但是对于技能,他们可能会或可能不会定义所有的attr,所以NULL。我希望能够识别null并继续前进,而不是因为它是NULL而失败。

我附加了一个GIST,我是一个n00b,我是现实生活中的系统工程师,但不是编码员。所以我很感激输入!

https://gist.github.com/bigdadmike/7548421

上面是我的所有代码,但具体来说这是我正在处理的部分,这些部分都已在脚本顶部声明为var。我已经更新了这篇文章,其中包含了对Basti的评论和建议。代码:

on('ready', function() {

  _.each(monsterManual, function (monsterData){
  log(monsterData.Name);

var character = createObj('character', {
    name: monsterData.Name,
    gmnotes: monsterData.FullText,
});
//*/

_.each(monsterAttributes, function(attr) {
    var max = "";
    var cur = "";
    var re;

    switch(attr){
    case 'AC':
      cur = parseInt(monsterData[attr].match(/(\d+)/)[1]);
      break;
    case 'Str':
    case 'Dex':
    case 'Con':
    case 'Int':
    case 'Wis':
    case 'Cha':
      re = new RegExp(attr + "\\s*(\\d*).*");
      cur = parseInt(monsterData['AbilityScores'].match(re)[1]);
      break;
    case 'HD':
    case 'Size':
    case 'CR':
      cur = monsterData[attr];
      break;
    case 'HP':
      cur = parseInt(monsterData[attr]);
      max = cur;
      break;
    case 'BaseAtk':
      cur = parseInt(monsterData[attr]);
      max = cur;
      break;
    case 'CMB':
        cur = monsterData[attr];
        max = cur;
        break;
    case 'CMD':
        cur = parseInt(monsterData[attr]);
        max = cur;
        break;
case 'Acrobatics':
case 'Appraise':
case 'Bluff':
case 'Climb':
case 'Craft (any one)':
case 'Diplomacy':
case 'Disable Device':
case 'Disguise':
case 'Escape Artist':
case 'Fly':
    case 'Handle Animals':
    case 'Heal':
    case 'Intimidate':
    case 'Knowledge (religion)':
    case 'Knowledge (planes)':
    case 'Knowledge (history)':
    case 'Knowledge (nature)':
    case 'Knowledge (any one)': 
    case 'Linguistics':
    case 'Perception':
    case 'Ride':
    case 'Sense Motive':
    case 'Sleight of Hand':
    case 'Spellcraft':
    case 'Stealth':
    case 'Survival':
    case 'Swim':
    case 'Use Magic Device':
      re = RegExp(attr.replace('(', '\\(').replace(')', '\\)') + "\\s*(\\d*).*");
      var match = re.exec(monsterData['Skills'])
        if(match != null) {
            cur = parseInt(monsterData['Skills'].match(re)[1]);
            } 
            else {
            cur = 0;
            }
        break;
    default:
      cur = parseInt(monsterData[attr]);
      break;
    }

    log([attr, cur, max].join(':'))

    if(cur != 0) {
        createObj('attribute', {
            characterid: character.id,
            name: attr,
            max: max,
            current: cur
        });
    }
    //*/
});

});
}); 

2 个答案:

答案 0 :(得分:2)

基本上

switch(attr) {
    case 'AC':
      //...
      break;
    case 'Str':
    case 'Dex':
      //...
      break;
    //...
}

将是

if(attr == 'AC') {
  //...
} else if (attr == 'Str' || attr == 'Dex') {
  //...
}

等等。直接跟随另一个案例的案例将转换为or - 表达式。

但是正如评论已经指出的那样,这是 - 关于可读性 - 一个坏主意......


您想要更改此代码部分:

case 'Use Magic Device':
  re = new RegExp(attr + "\\s*(\\d*).*");
  cur = parseInt(monsterData['Skills'].match(re)[1]);
  break;

case 'Use Magic Device':
  re = RegExp(attr.replace('(', '\\(').replace(')', '\\)') + "\\s*(\\d*).*");
  var match = re.exec(monsterData['Skills'])
  if(match != null) {
    cur = parseInt(match[1]);
  } else {
    cur = 0;
  }
  break;

这将检查匹配是否成功(在这种情况下怪物实际上具有技能)。如果匹配失败(monst没有这个技能),那么就不会出现解析错误,并且中断允许你跳出开关。

进一步向下,你想用if:

来调用createObject
if(cur != 0) {
  createObj('attribute', {
      characterid: character.id,
      name: attr,
      max: max,
      current: cur
  });
}

此外,在您的monsterAttributes中,有两个拼写错误会导致cur获得NaN:

var monsterAttributes = [
  /*...*/
  'Disguise ', //there's a whitespace after Disguise, remove it!
  /*...*/
  'Use Magic device', //the 'd' has to be capital, as you check on 'Use Magic Device'
  /*...*/
];

答案 1 :(得分:0)

如果我理解正确,你可以简单地检查attr是否为null,如果是这种情况则避免使用switch语句。例如:

if( attr != undefined && attr != null ){
  switch(attr){
    //... the code as is in here


  }// end switch
} // end if statement