Tengo un objeto llamado move_dict y estoy usando el método get_learned_by_pokemon() para llenarlo. En getPokes() llamo a get_learned_by_pokemon() y espero que se llene move_dict . Sin embargo, está vacío.
function move(){ let move_dict = {} let db_data = JSON.parse(fs.readFileSync('pokes.json', 'utf8')); async function get_learned_by_pokemon(curr_move, move_dict, current_poke){ response = await axios.get('https://pokeapi.co/api/v2/move/'.concat(curr_move)) let learned_by_pokemons = [] for (let k = 0; k < response.data.learned_by_pokemon.length; k++){ learned_by_pokemons.push(response.data.learned_by_pokemon[k].name) } // pass if (learned_by_pokemons.includes(current_poke)){move_dict[current_poke].pass.push(curr_move)} // fail else{move_dict[current_poke].fail.push(curr_move)} } function getPokes(){ //iterate through all pokemon for (let i = 0; i < db_data.length; i++){ let current_poke = db_data[i].name let moves = db_data[i].moves move_dict[current_poke] = {pass: [], fail: []} //iterate through all moves of pokemon for (let j = 0; j < moves.length; j++){ let curr_move = moves[j] //get data on current move get_learned_by_pokemon(curr_move, move_dict, current_poke) } } } getPokes() } También he usado una espera antes de Axios.get() . Me gustaría saber por qué move_dict no se está llenando y me gustaría solucionar este problema sin usar setTimeout()
Parece que el OP comienza con un archivo json que describe pokemons. Por el código, parece que el archivo contiene al menos lo siguiente...
[ { name: 'nameA', moves: [ 1, 2, 3, ... ] }, { name: 'nameB', moves: [ 3, 4, 5, ... ] }, ... ]Parece que hay un punto final de API que toma un movimiento ("id o nombre") y devuelve, entre otras cosas, una lista de Pokémon que han "aprendido" ese movimiento.
Y parece que el OP pretende producir un diccionario como este...
{ nameA: { pass: [1, 2, ...], fail: [3, 4, ...] }, nameB: { pass: [3, 4, ...], fail: [4, 5, ...] }, ... }... donde los movimientos de matrices de aprobación y falla encontrados en el archivo de entrada que son o no son movimientos aprendidos de acuerdo con la API.
Dado que no queremos llamar a la API de forma redundante, y dado que puede haber movimientos redundantes en el archivo de entrada, vale la pena crear una estructura intermedia que asocie movimientos únicos en la entrada de los Pokémon que los han aprendido, como este. ..
{ // key is a move id or name, value is an array of pokemon names 1 : [ 'nameA', 'nameB', ... ], 2 : [ 'nameC', 'nameD', ... ], ... }Así es como describiría la idea en código (no compilado ni probado)...
async function get_learned_by_pokemon(move){ const response = await axios.get(`https://pokeapi.co/api/v2/move/${move}`); return response.data.learned_by_pokemon.map(p => p.name); } async function move() { let db_data = JSON.parse(fs.readFileSync('pokes.json', 'utf8')); let allMoves = db_data.flat_map(p => p.moves); let uniqueMoves = [...new Set(allMoves)]; // map move ids to pokemons who learned the moves { moveId: [ 'pokeA', 'pokeB' ...], ...} let learnedBy = {} for (let move in uniqueMoves) { learnedBy[move] = await get_learned_by_pokemon(move); } // map pokemon names to a pair of arrays indicating if they have learned their moves (pass) or not (fail) let move_dict = db_data.reduce((acc, p) => { let name = p.name; let pass = p.moves.filter(move => learnedBy[move].includes(name)); let fail = p.moves.filter(move => !learnedBy[move].includes(name)); acc[name] = { pass, fail }; return acc; }, {}); return move_dict; }hay 2 errores con tu código. 1: ¿dónde llamas a getPokes() ? 2: get_learned_by_pokemon es una función asíncrona, por lo que debe usar await si desea esperar a que se complete