所以我在支持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
});
}
//*/
});
});
});
答案 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