javascript - 如何将以下语句转换为 if 语句?

标签 javascript

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

我附上了一个 GIST,我是这方面的新手,我是现实生活中的系统工程师,但不是编码员。因此,我将不胜感激!

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

上面是我的所有代码,但具体来说这是我正在处理的部分,这些都已在脚本顶部声明为 var 。我已经用巴斯蒂迄今为止的评论和建议更新了这篇文章。代码:

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
        });
    }
    //*/
});

});
}); 

最佳答案

基本上

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

将会

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

等等。直接跟随另一个 case 的 case 将被转换为 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;

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

接下来,您希望使用 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'
  /*...*/
];

关于javascript - 如何将以下语句转换为 if 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20080251/

相关文章:

javascript - 我发现使用 log4js-protractor-appender 有问题

javascript - 使用 Bootstrap 设置响应式背景图像以覆盖表格的宽度

javascript - AngularJS类类型检查解决方案

javascript - 为什么这个webm不能播放?

javascript - Webassembly 最终会在浏览器中呈现为 HTML 吗?

javascript - 当您以编程方式设置文本框值时,jquery `on change` 无法识别

Javascript 滚动菜单,仅在页面向下移动特定方式后启动

javascript - 缩放和平移 Canvas 后鼠标坐标不匹配

javascript - 有人有渲染 HTML 的差异算法吗?

javascript - 带有可选小数点的十进制数的正则表达式