我正在制作一个javascript游戏,有几个级别,存储在json中。 加载时,我运行一个函数来“解析”关卡对象,方法是替换默认值不存在的值,或者用对象替换某些值,例如:
//i is the variable I use to loop through the enemies
if (typeof(level.enemies[i].life)=="undefined") {
level.enemies[i].life=100;
}
if (typeof(level.enemies[i].follow)=="number") {
level.enemies[i].follow=level.enemies[level.enemies[i].follow];
// replace the number of the enemy,
// by a reference to the actual enemy.
}
问题是我在整个函数中有很多类似于这些的“ifs”,我想知道我是否能以某种方式将它们缩减为函数,所以我可以这样做:
replaceByType(level.enemies[i].life,"undefined",100);
replaceByType(level.enemies[i].follow,"number",level.enemies[level.enemies[i].follow]);
可悲的是,我不知道如何做到这一点,因为他们无法通过引用传递变量(除了对象)。也许有另一种方法来简化我的代码?
答案 0 :(得分:1)
我想你想要这样的东西:
replaceIfAbsent(level.enemies[i], "life", 100);
function replaceIfAbsent(obj, property, newVal){
if (typeof obj[property] === "undefined")
obj[property] = newVal;
}
或者为什么不一次做多个属性:
function replaceIfAbsent(obj, properties){
for (var prop in properties)
if (typeof obj[prop.name] === "undefined")
obj[prop.name] = prop.value;
}
replaceIfAbsent(level.enemies[i], [{name: "life", value: 100}, {name: "number", value: 12}]);
您使用的是jQuery吗?如果是这样,你可以这样做:
$.extend(level.enemies[i], {"life": 100, "number": 12});
答案 1 :(得分:0)
Pass anonymous functions:
function replaceByType(test, pass, fail){
if(test()) return pass;
else return fail;
}
replaceByType(function(){return level.enemies[i].life},"undefined",100);
这将评估推迟到replaceByType
内。
答案 2 :(得分:0)
由于您可以通过引用传递对象,因此可以传递要替换的对象的属性。
function replaceByType(obj, property, type, value) {
if(typeof obj[property] === type) {
obj[property] = value;
}
}
你几乎可以打电话给你:
replaceByType(level.enemies[i], "life", "undefined", 100);
replaceByType(level.enemies[i], "follow", "number", level.enemies[level.enemies[i].follow]);