итерация JSON-связывающих объектов - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь написать функцию, которая принимает имя покемона в качестве аргумента, и выяснить, у какого покемона есть это имя в поле «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)

но возвращается ошибка, которая говорит Uncaught TypeError: Невозможно прочитать свойство 'includes' nextEvolution.js: 4090 из неопределенных

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

и выясните, у какого покемона есть это имя в поле «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}]
  ))
0 голосов
/ 07 мая 2018

Вы не можете использовать , включая функцию , непосредственно для массива, имеющего объекты вместо одного объекта. Это даст ложь как вывод. Например:

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

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

В результате false всегда. Правильный способ - использовать карту, чтобы получить поле определенного объекта, на котором вы хотите использовать функцию include.

например:

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)) { ...
0 голосов
/ 07 мая 2018

Один или несколько ваших покемонов не имеют установленного поля 'next_evolution' (например, с идентификатором 3 в вашем файле). Следовательно, allPokemon[x].next_evolution оценивается как неопределенное, и вы не можете прочитать 'include' на этом.

Сначала проверьте наличие next_evolution.

if (allPokemon[x].next_evolution && 
    allPokemon[x].next_evolution.includes(nameOfPokemon)) { ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...