Estoy tratando de encontrar una solución para hacer un bucle (Javascript) hasta que la matriz de objetos esté vacía. Aquí el objeto que quiero usar:
"chain": { "evolves_to": [{ "evolves_to": [{ "evolves_to": [], "species": { "name": "nidoqueen" } }], "species": { "name": "nidorina" } }], "species": { "name": "nidoran-f" } } Me gustaría hacer un bucle hasta encontrar la variable evolves_to empty. y en cada bucle species.name , para enumerar la evolución, en mi caso: nidoran-f -> nidorina -> nidoqueen
Todavía no puedo encontrar una buena manera de hacerlo. Un poco perdido. Gracias por tu ayuda ;)
Puedes usar una función recursiva:
const chain = { "evolves_to": [{ "evolves_to": [{ "evolves_to": [], "species": { "name": "nidoqueen" } }], "species": { "name": "nidorina" } }], "species": { "name": "nidoran-f" } } , traverse = obj => { if(!obj.evolves_to.length) { console.log(obj.species.name) return } else { console.log(obj.species.name, "=>") traverse(obj.evolves_to[0]) } } traverse(chain)O para recopilar valores en una matriz:
const chain = { "evolves_to": [{ "evolves_to": [{ "evolves_to": [], "species": { "name": "nidoqueen" } }], "species": { "name": "nidorina" } }], "species": { "name": "nidoran-f" } } , arr = [] , traverse = obj => { if(!obj.evolves_to.length) { arr.push(obj.species.name) return } else { arr.push(obj.species.name) traverse(obj.evolves_to[0]) } } traverse(chain) console.log(arr.join(" -> "))Una función recursiva simple debería hacer el truco:
const evolutions = { "chain": { "evolves_to": [{ "evolves_to": [{ "evolves_to": [], "species": { "name": "nidoqueen" } }], "species": { "name": "nidorina" } }], "species": { "name": "nidoran-f" } } } function findNoEvolution(obj, evolutionStages) { if (obj.evolves_to.length > 0) { for (let i = 0; i < obj.evolves_to.length; i += 1) { const found = findNoEvolution(obj.evolves_to[i], evolutionStages); if (found) { evolutionStages.push(obj.species.name) return found; } } } evolutionStages.push(obj.species.name) return true; } const evolutionStages = []; findNoEvolution(evolutions.chain, evolutionStages); const evolutionStagesStr = evolutionStages.reverse().join(' -> '); console.log(evolutionStagesStr); La matriz de evolución resultante se invierte para comenzar desde la primera evolución a través reverse() y se une mediante flechas a través de joing(' -> ') .