2016-08-24 1 views
5

Я - Угловой новичок, и немногому учусь, пытаясь вытащить цепочку эволюции для каждого покемона, используя pokeapi, но имея трудное время из-за глубокого гнездования.PokeAPI + Angular: Как получить эволюционную цепочку покемонов

Типичный объект возвращается ответ, как это:

{ 
    "baby_trigger_item": null, 
    "id": 2, 
    "chain": { 
    "evolution_details": [], 
    "evolves_to": [ 
     { 
     "evolution_details": [ 
      { 
      "min_level": 16, 
      "min_beauty": null, 
      "time_of_day": "", 
      "gender": null, 
      "relative_physical_stats": null, 
      "needs_overworld_rain": false, 
      "turn_upside_down": false, 
      "item": null, 
      "trigger": { 
       "url": "http://pokeapi.co/api/v2/evolution-trigger/1/", 
       "name": "level-up" 
      }, 
      "known_move_type": null, 
      "min_affection": null, 
      "party_type": null, 
      "trade_species": null, 
      "party_species": null, 
      "min_happiness": null, 
      "held_item": null, 
      "known_move": null, 
      "location": null 
      } 
     ], 
     "evolves_to": [ 
      { 
      "evolution_details": [ 
       { 
       "min_level": 36, 
       "min_beauty": null, 
       "time_of_day": "", 
       "gender": null, 
       "relative_physical_stats": null, 
       "needs_overworld_rain": false, 
       "turn_upside_down": false, 
       "item": null, 
       "trigger": { 
        "url": "http://pokeapi.co/api/v2/evolution-trigger/1/", 
        "name": "level-up" 
       }, 
       "known_move_type": null, 
       "min_affection": null, 
       "party_type": null, 
       "trade_species": null, 
       "party_species": null, 
       "min_happiness": null, 
       "held_item": null, 
       "known_move": null, 
       "location": null 
       } 
      ], 
      "evolves_to": [], 
      "is_baby": false, 
      "species": { 
       "url": "http://pokeapi.co/api/v2/pokemon-species/6/", 
       "name": "charizard" 
      } 
      } 
     ], 
     "is_baby": false, 
     "species": { 
      "url": "http://pokeapi.co/api/v2/pokemon-species/5/", 
      "name": "charmeleon" 
     } 
     } 
    ], 
    "is_baby": false, 
    "species": { 
     "url": "http://pokeapi.co/api/v2/pokemon-species/4/", 
     "name": "charmander" 
    } 
    } 
} 

Я должен добраться до evolves_to собственности, и захватить species.name, а также evolution_details.min_level и evolution_details.trigger.name и evolution_details.item если не нулевой

Но, как вы можете видеть, evolves_to свойство, само по себе содержит еще evolves_to вложен внутри, который другой вложенной внутрь

Это моя печальная попытка (после http.get), и я просто застрял Теперь.

var evoObject = response.data; 

function loopEvo(obj){ 
    angular.forEach(obj, function(value, key, object){ 
     if (key == 'evolves_to' && value != []) { 
      //from here I can get top level data, but... 
     } 
    }); 
} 

loopEvo(evoObject.chain); 

Я не знаю, как рекурсивно погружаться в объекты и постоянно захватывать данные, может ли кто-нибудь помочь? Я хотел бы использовать это как отличную возможность обучения в обходе сложных объектов json.

ответ

1

Вы всегда можете просто избегать использования Углового и палочки с простым JS, чтобы построить свою эволюционную цепочку ... попробуйте дать это, это было основано на вашей угловой петле. Это должно оставить вас с массивом (evoChain) объектов, содержащих данные, которые вы ищете, от первой эволюции с индексом 0 до последней эволюции по последнему индексу.

var evoChain = []; 
var evoData = response.data.chain; 

do { 
    var evoDetails = evoData['evolution_details'][0]; 

    evoChain.push({ 
    "species_name": evoData.species.name, 
    "min_level": !evoDetails ? 1 : evoDetails.min_level, 
    "trigger_name": !evoDetails ? null : evoDetails.trigger.name, 
    "item": !evoDetails ? null : evoDetails.item 
    }); 

    evoData = evoData['evolves_to'][0]; 
} while (!!evoData && evoData.hasOwnProperty('evolves_to')); 

В вашем случае выше примере результирующего массива должен выглядеть следующим образом:

[{ 
    "species_name": "charmander", 
    "min_level": 1, 
    "trigger_name": null, 
    "item": null 
}, { 
    "species_name": "charmeleon", 
    "min_level": 16, 
    "trigger_name": "level-up", 
    "item": null 
}, { 
    "species_name": "charizard", 
    "min_level": 36, 
    "trigger_name": "level-up", 
    "item": null 
}] 
+0

Это работает точно так же, как вы сказали, ничего себе! Для обучения я попытаюсь изучить это и посмотреть, смогу ли я сделать что-то подобное «угловым способом», но это большое спасибо! – coderpolarbear