我正在尝试编写一个以口袋妖怪的名字为参数的函数,并找出所有口袋妖怪在其“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
答案 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)) { ...