Javascript PokeAPI:从JSON获取复杂的演化链,使其扁平化
我试图从PokeAPI那里得到进化链,我在stackoverflow中得到了另一个答案 顺便说一句,我不明白如何从“evolves_to array”获取所有元素,然后返回到更高的级别以转到数组本身的下一个元素。例如,我希望得到如下数组:Javascript PokeAPI:从JSON获取复杂的演化链,使其扁平化,javascript,arrays,json,tree,Javascript,Arrays,Json,Tree,我试图从PokeAPI那里得到进化链,我在stackoverflow中得到了另一个答案 顺便说一句,我不明白如何从“evolves_to array”获取所有元素,然后返回到更高的级别以转到数组本身的下一个元素。例如,我希望得到如下数组: [{ "species_name": "charmander", "min_level": 1, "trigger_name": null, "item": null }, { "species_name": "
[{
"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
}]
但是从这样一个JSON,通过包含多个元素的“evolves_to”数组:
{
"baby_trigger_item": null,
"chain": {
"evolution_details": [],
"evolves_to": [
{
"evolution_details": [
{
"gender": null,
"held_item": null,
"item": null,
"known_move": null,
"known_move_type": null,
"location": null,
"min_affection": null,
"min_beauty": null,
"min_happiness": null,
"min_level": 7,
"needs_overworld_rain": false,
"party_species": null,
"party_type": null,
"relative_physical_stats": null,
"time_of_day": "",
"trade_species": null,
"trigger": {
"name": "level-up",
"url": "https://pokeapi.co/api/v2/evolution-trigger/1/"
},
"turn_upside_down": false
}
],
"evolves_to": [
{
"evolution_details": [
{
"gender": null,
"held_item": null,
"item": null,
"known_move": null,
"known_move_type": null,
"location": null,
"min_affection": null,
"min_beauty": null,
"min_happiness": null,
"min_level": 10,
"needs_overworld_rain": false,
"party_species": null,
"party_type": null,
"relative_physical_stats": null,
"time_of_day": "",
"trade_species": null,
"trigger": {
"name": "level-up",
"url": "https://pokeapi.co/api/v2/evolution-trigger/1/"
},
"turn_upside_down": false
}
],
"evolves_to": [],
"is_baby": false,
"species": {
"name": "beautifly",
"url": "https://pokeapi.co/api/v2/pokemon-species/267/"
}
},
{
"evolution_details": [
{
"gender": null,
"held_item": null,
"item": null,
"known_move": null,
"known_move_type": null,
"location": null,
"min_affection": null,
"min_beauty": null,
"min_happiness": null,
"min_level": 7,
"needs_overworld_rain": false,
"party_species": null,
"party_type": null,
"relative_physical_stats": null,
"time_of_day": "",
"trade_species": null,
"trigger": {
"name": "level-up",
"url": "https://pokeapi.co/api/v2/evolution-trigger/1/"
},
"turn_upside_down": false
}
],
"evolves_to": [
{
"evolution_details": [
{
"gender": null,
"held_item": null,
"item": null,
"known_move": null,
"known_move_type": null,
"location": null,
"min_affection": null,
"min_beauty": null,
"min_happiness": null,
"min_level": 10,
"needs_overworld_rain": false,
"party_species": null,
"party_type": null,
"relative_physical_stats": null,
"time_of_day": "",
"trade_species": null,
"trigger": {
"name": "level-up",
"url": "https://pokeapi.co/api/v2/evolution-trigger/1/"
},
"turn_upside_down": false
}
],
"evolves_to": [],
"is_baby": false,
"species": {
"name": "dustox",
"url": "https://pokeapi.co/api/v2/pokemon-species/269/"
}
}
],
"is_baby": false,
"species": {
"name": "cascoon",
"url": "https://pokeapi.co/api/v2/pokemon-species/268/"
}
}
],
"is_baby": false,
"species": {
"name": "silcoon",
"url": "https://pokeapi.co/api/v2/pokemon-species/266/"
}
}
],
"is_baby": false,
"species": {
"name": "wurmple",
"url": "https://pokeapi.co/api/v2/pokemon-species/265/"
}
},
"id": 135
}
那么,我怎样才能让它变得平淡呢?感谢谁来回答我,并为我糟糕的英语感到抱歉。我知道时间已经晚了,但对于更多的提问者,我用C#做了这个算法,你带来进化链并返回所有的子链:
public static void PrintEvolutionChain(EvolutionChain pokemon)
{
int counter = 1;
List<List<Pokemon>> pokemons = new List<List<Pokemon>>();
List<Pokemon> pokemonsTemp = new List<Pokemon>();
foreach (EvolvesTo envolveTo in pokemon.envolvesTo)
{
pokemonsTemp.Add(pokemon.Pokemon);
PrintPreorder(envolveTo,pokemons,pokemonsTemp);
}
foreach (List<Pokemon> pokemones in pokemons)
{
Console.WriteLine($"Chain: {counter}");
foreach (Pokemon pokemonchain in pokemones)
{
Console.WriteLine($"Pokemon: {pokemonchain.Name}");
}
counter++;
}
}
public static void PrintPreorder(EvolvesTo pokemon, List<List<Pokemon>> pokemons, List<Pokemon> pokemonsTemp)
{
pokemonsTemp.Add(pokemon.pokemon);
if (pokemon == null || pokemon.envolvesTo.Count == 0 )
{
pokemons.Add(new List<Pokemon>(pokemonsTemp));
pokemonsTemp.Clear();
return;
}
if(pokemon.envolvesTo.Count == 1)
{
foreach (EvolvesTo envolveTo in pokemon.envolvesTo)
{
PrintPreorder(envolveTo, pokemons, pokemonsTemp);
}
}
else if (pokemon.envolvesTo.Count > 1){
List<Pokemon> pokemonsTempTemp = new List<Pokemon>(pokemonsTemp);
foreach (EvolvesTo envolveTo in pokemon.envolvesTo)
{
if (pokemonsTemp.Count == 0)
pokemonsTemp = pokemonsTempTemp;
PrintPreorder(envolveTo, pokemons, pokemonsTemp);
}
}
}
publicstaticvoidprintEvolutionChain(EvolutionChain口袋妖怪)
{
int计数器=1;
List pokemons=新列表();
List pokemonsTemp=新列表();
foreach(口袋妖怪中的EvolvesTo envolveTo.envolvesTo)
{
pokemonsTemp.Add(pokemon.pokemon);
printporeorder(envolveTo、pokemons、pokemonsTemp);
}
foreach(列出口袋妖怪中的口袋妖怪)
{
WriteLine($“链:{counter}”);
foreach(口袋妖怪中的口袋妖怪)
{
WriteLine($“Pokemon:{pokemonchain.Name}”);
}
计数器++;
}
}
公共静态无效打印预订单(EvolvesTo口袋妖怪、列表口袋妖怪、列表口袋妖怪)
{
pokemonsTemp.Add(pokemon.pokemon);
if(pokemon==null | | pokemon.envolvesTo.Count==0)
{
添加(新列表(pokemonsTemp));
pokemonsTemp.Clear();
返回;
}
if(pokemon.envolvesTo.Count==1)
{
foreach(口袋妖怪中的EvolvesTo envolveTo.envolvesTo)
{
printporeorder(envolveTo、pokemons、pokemonsTemp);
}
}
else if(pokemon.envolvesTo.Count>1){
List pokemonsTemp=新列表(pokemonsTemp);
foreach(口袋妖怪中的EvolvesTo envolveTo.envolvesTo)
{
if(pokemonsTemp.Count==0)
pokemonsTemp=pokemonsTemp;
printporeorder(envolveTo、pokemons、pokemonsTemp);
}
}
}
它可以更干净,但如果您知道如何清洁它,请在下面发表评论。口袋妖怪API?Woa从来不知道有这样的事情存在!;)。