2012-01-14 59 views
1

我正在制作一个JavaScript游戏,具有几个级别,存储在json中。 当加载,我运行一个函数来通过替换不存在可以通过默认值的值“解析”级对象,或者通过对象替换一些值,如:javascript替代严格评估

//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. 
} 

的问题是,我有很多的整个功能的“如果”,类似这些,我想知道如果我以某种方式导致他们的功能,所以我可以这样做:

replaceByType(level.enemies[i].life,"undefined",100); 
replaceByType(level.enemies[i].follow,"number",level.enemies[level.enemies[i].follow]); 

可悲的是,我不知道如何做到这一点,因为他们没有办法通过引用传递一个变量(除了一个对象)。也许有另一种方法来简化我的代码?

回答

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]); 
+0

太棒了!我没有想过将物体与物体分开。我们甚至可以做'replaceByType(window,“variable”,“undefined”,5);'改变一个全局变量! – Zelenova 2012-01-14 23:23:32

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

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

+1的jQuery.extend建议(这将是我唯一的建议;-) - 其他图书馆,不仅jQuery提供了合并功能。 – 2012-01-14 23:03:58