2012-01-14 5 views
1

私は、jsonに格納されたいくつかのレベルを特徴とする、javascriptゲームを作っています。 読み込み、Iは、またはのような、オブジェクトがいくつかの値を置き換えることにより、デフォルト値では存在しない値を置き換えることにより、レベルのオブジェクトを「解析」する機能を実行する:厳密な評価のための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. 
} 

問題されるI機能を通じてこれらと同様の「IFS」をたくさん持っている、と私はこれを行うことができますので、私は何とか機能にそれらを減らすことができる場合、私は疑問に思って:

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; 
    } 
} 

:私の唯一の提案;-)されているだろうjQuery.extend提案(ため

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

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は、マージ機能を提供します。 –

関連する問題