包含JSON的迭代对象

时间:2018-05-07 13:49:10

标签: javascript html function object methods

我正在尝试编写一个以口袋妖怪的名字为参数的函数,并找出所有口袋妖怪在其“next_evolution”字段中都有该名称

考虑以下JSON数据集 - 访问https://raw.githubusercontent.com/Biuni/PokemonGO-Pokedex/master/pokedex.json

现在,我已经写了以下功能:

var infoOfPokemon = function(nameOfPokemon,allPokemon){
for(x in allPokemon){
if(allPokemon[x].next_evolution.includes(nameOfPokemon)){
  console.log('pokemons found: '+allPokemon[x].name)
} else{
  null
}
 }
}
var nameOfPokemon =prompt('enter the name of Pokemon')
infoOfPokemon(nameOfPokemon,pokemonData.pokemon)

但是它返回了一个错误  未捕获的TypeError:无法读取属性'包含' nextEvolution.js:未定义的4090

3 个答案:

答案 0 :(得分:2)

您的一个或多个宠物小精灵没有设置'next_evolution'字段(例如,文件中ID为3的字段)。因此,<button type="button" class="btn btn-primary">Primary</button> <button type="button" class="btn btn-secondary">Secondary</button> <button type="button" class="btn btn-success">Success</button> 评估为未定义,您无法在其上阅读“包含”。

首先检查是否存在allPokemon[x].next_evolution

next_evolution

答案 1 :(得分:0)

  

找出所有口袋妖怪在他们的“next_evolution”字段中有哪个名字

这应该让你想到filter。你想过滤口袋妖怪的列表,找到匹配的。

但是,正如已经指出的那样,如果您正在测试的宠物小精灵没有false字段,您需要能够在过滤谓词中返回next_evolution。你可以通过测试来做到这一点,如另一个答案所示:pokemon.next_evolution && pokemon.next_evolution.includes...,或者你可以默认,如下所示:(pokemon.next_evolution || []).includes...

(请注意,您原来和该答案都会错过一个步骤,然后从那些name值中收集next_evolution个属性。

所以这是一个简单的函数,它应该过滤列表以找到正确的项目。要在调用API时使用它,我将其打包在fetch调用中,只需console.log结果即可。显然,您可能还有其他方法可以调用它。

const infoOfPokemon = (name, all) => all.filter(pokemon => 
  (pokemon.next_evolution || []).map(p => p.name).includes(name)
)

fetch('https://raw.githubusercontent.com/Biuni/PokemonGO-Pokedex/master/pokedex.json')
  .then(resp => resp.json())
  .then(allPokemon => console.log(
    infoOfPokemon('Butterfree', allPokemon.pokemon) //~> [{Caterpie}, {Metpod}]
  ))

答案 2 :(得分:0)

您不能直接在具有对象的数组上使用包含函数而不是单个对象。它将输出错误。 例如:

var pets = [{'name':'cat'},{'name':'dog'},{'name':'bat'}];

console.log(pets.includes("cat"))  //false

这会导致 false 。 正确的方法是使用地图来获取您要使用的特定对象字段包括函数。

e.g:

var pets = [{'name':'cat'},{'name':'dog'},{'name':'bat'}];

console.log(pets.map((obj)=> obj.name).includes("cat")); //true

在你的情况下,首先看看allPokemon [x] .next_evolution是否未定义(即 next_evolution 键是否存在) 代码变成:

if (allPokemon[x].next_evolution && 
allPokemon[x].next_evolution.(obj)=> obj.name).includes(nameOfPokemon)) { ...