2015-04-29 64 views
2

我有以下的數據對象,並最終會有內entities更多類似的:搜索JSON值多層次深

function loadCardLibrary() { 
    var cardLibrary = { 
     entities: [ 
      { 
       name: "Spareparts", 
       values: { 
        sickness: 0, 
        attack: 0, 
        scrap: 3, 
        manaCost: 0 
       }, 
       apply: [ 
        applyCreature("Mech"), 
        applyHealth(1), 
        applyNoAttack(true) 
       ] 
      } 
     ] 
    }; 
    return cardLibrary; 
} 

我試圖寫一個函數(見本example)來搜索name值,然後再在該對象和搜索,檢查是否有特定apply值,就像這樣:

function checkHasNoAttack(entityName) { 
    for (var entity in cardLibrary.entities) { 
     if (cardLibrary.entities[entity].name === entityName) { 
      // for debugging 
      console.log(cardLibrary.entities[entity]); 
      console.log(); // blank line 
      for (var applied in cardLibrary.entities[entity].apply) { 
       if (cardLibrary.entities[entity].apply[applied].applyNoAttack === true) { 
        console.log(entityName + " cannot attack."); 
       } else { 
        console.log("test"); 
        break; 
       } 
      } 
     } 
    } 
} 

當我後立即調用它,就像這樣:

var canItAttack = checkHasNoAttack("Spareparts"); 

...這就是結果:

{ 
    name: 'Spareparts', 
    values: { 
     sickness: 0, 
     attack: 0, 
     scrap: 3, 
     manaCost: 0 
    }, 
    apply: [ 'Mech', 1, true ] 
} 

test 

代替test它來源於else,我試圖登錄的得到它響應第一if聲明,並記錄:

備件無法攻擊。

的理解是更復雜的邏輯最終將取代console.log那裏我真的需要這個工作,但一直與它修修補補,我只是似乎無法得到它的權利。任何幫助非常感謝!

+0

是不是你的'應用'數組? 'cardLibrary.entities [entity] .apply [applied] .applyNoAttack'很可能是'undefined'。 – Passerby

+0

我想這可能是,我錯過了什麼?它確實得到了一些「未定義」的錯誤,寫得有點不同。你能找到解決方法嗎?我提供了一個鏈接來運行代碼,如果你知道一個解決方法,請發表一個答案! – Phrancis

+0

我想你可能想改變你的'申請'到'apply:{applyCreature:applyCreature(「Mech」),applyHealth:applyHealth(1),applyNoAttack:applyNoAttack(true)}' – Passerby

回答

3

這是非常簡單的:

function check(a) { 
    var result = null; 
    cardLibrary.entities.forEach(function(b){ 
     if (b.name === a) { 
      if (b.apply[2] === true) { 
       console.log(a + " cannot attack!"); 
      } else { 
       console.log("test"); 
      } 
      result = b; 
     } 
    }); 
    return result; 
} 

apply是一個數組,你必須使用[2]來選擇值


陣列在此做一個醜陋的工作,我建議您修改apply轉化爲對象:

apply: { 
    creature: applyCreature("Mech"), 
    health: applyHealth(1), 
    noAttack: applyNoAttack(true) 
} 

然後你可以使用這段代碼:

function check(a) { 
    var result = null; 
    cardLibrary.entities.forEach(function(b){ 
     if (b.name === a) { 
      if (b.apply.noAttack === true) { 
       console.log(a + " cannot attack!"); 
      } else { 
       console.log("test"); 
      } 
      result = b; 
     } 
    }); 
    return result; 
} 
+0

我真的希望能夠通過名稱而不是索引來引用「應用」事物,然後將它們製作成單個的子對象而不是數組中的值? – Phrancis

+0

@Pranranis是的,絕對。數組並不是真正爲此設計的,因爲它可以使用,等等。 – Downgoat

+0

我可以建議將它應用到您的答案中嗎? – Phrancis