所以我在支持 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/