Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

196
Visualizações
Javascript: recursividad que regresa indefinida

¿Por qué mi recursividad regresa indefinida? Estoy tratando de "decodificar" datos de niños anidados de mongo que se devuelven como ID como:

 { "_id": "613fd030f374cb62f8f91557", "children": [ "613fd035f374cb62f8f9155b", "613fd136f374cb62f8f91564", "613fd1a5f374cb62f8f91571", "613fd20bf374cb62f8f9157c" ], ...more data }

Mi objetivo es profundizar y convertir cada ID de niño en el Objeto que representa la ID y convertir sus ID de niños en objetos y luego continuar hasta que el child === [] (sin niños). Estoy tratando de que el padre inicial ( 613fd030f374cb62f8f91557 ) tenga acceso a todos los objetos secundarios anidados de varios niveles.

Este es mi código:

 const get_documents = (documents) => { // Loop through each document documents.map((document) => { if (document.parent === null) { //convert children ids (_id) to array of objects let dbData = []; document.children.map((id) => { let dbChildren = documents.find((x) => x._id === id); dbData.push(dbChildren); }); let formattedData = []; dbData.map((child) => { let formattedObject = { id: child._id, name: child.name, depth: 0, parent: child.parent, closed: true, children: child_recursion(child.children), }; formattedData.push(formattedObject) }); } }); };
 const child_recursion = (arr) => { let dbData = []; arr.map((id) => { let dbChildren = documents.find((x) => x._id === id); dbData.push(dbChildren); }); let formattedData = []; dbData.map((child) => { let newChild = []; if (child.children.length > 1) { newChild = child_recursion(child.children); } let formattedObject = { id: child._id, name: child.name, depth: 0, parent: child.parent, closed: true, children: newChild, }; formattedData.push(formattedObject); if (newChild === []) { return formattedData } }); };

¿Qué estoy haciendo mal en mi recursividad? ¡Gracias por la ayuda!

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Lo que te trae aquí es mezclar mutación con recursividad, lo que tiende a complicar mucho más las cosas.

Lo que esta línea me está diciendo:

 children: child_recursion(child.children),

es que siempre está esperando que child_recursion devuelva una matriz de niños formateados.

Sin embargo, en child_recursion no siempre devuelves algo. A veces estás mutando a veces en su lugar. Personalmente, creo que tiende a ser más fácil entender que no se usa la mutación.

El proceso, por lo tanto, debería ser algo como esto:

  1. dado un objeto
  2. comprobar si ese objeto tiene hijos
    1. si convierte a los niños usando esta función
    2. si no es así, detener la recursividad
  3. devolver un nuevo objeto, creado a partir del objeto de entrada con mis hijos establecidos en la salida de la conversión.

De esta forma podemos convertir cada hijo en un objeto con sus hijos convertidos y así sucesivamente.

También es algo extraño que esté intentando convertir todos los documentos a la vez. En cambio, como dio en su pregunta, debe concentrarse en el objeto que está tratando de convertir y trabajar hacia abajo desde allí. Si es el caso en el que los objetos pueden ser tanto padres como hijos, entonces tiene un gráfico, no un árbol, y la recursividad tendría que manejarse de manera diferente a lo que espera.

Realmente no necesitamos dos funciones para hacer esto, solo una y en el caso de que ya tenga los objetos que está buscando, también puede pasarlos (si no solo elimina los documentos y los obtiene de la base de datos o algún servicio en su lugar). También podemos usar lo que se llama un acumulador para establecer valores iniciales antes de nuestra recursión y rastrearlos a medida que recurrimos.

 const convert_children = (obj, documents) => { const convert_children_acc = (obj, documents, parent, depth) => { let partial_format = { id: obj._id, name: obj.name, depth: depth, parent: parent, close: true } if (obj.children && obj.children.length === 0) { return { ...partial_format, children: [] } } else { return { ...partial_format, children: obj.children.map(child => { child = documents.find(x => child === x._id); return convert_children_acc(child, documents, obj._id, depth+1) }) } } } return convert_children_acc(obj, documents, null, 0); };

https://jsfiddle.net/5gaLw1y7/

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda