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

127
Visualizações
Función recursiva de JavaScript para poner datos de mapas múltiples en un objeto de árbol

Tengo una clase de árbol general con: myTree = new Tree(string), appendChildNode(node), createChildNode(string), funciones myTree.print() y atributos myTree.name, myTree.children , etc.

También tengo un mapa múltiple con datos que quiero descomponer y poner en un objeto de árbol. Supongamos que los datos no tienen círculos. Mi idea es dejar que la recursión construya las subramas. Por alguna razón, la recursión no funciona y no puedo entender por qué. El retorno dentro de forEach me da un 'indefinido'

mi multimapa:

 aaaa -> [b, c, d] c -> [f] f -> [g] r -> [p]

Entonces mi árbol resultante para "aaaa" debería ser:

 aaaa bcd f g

mi función principal:

 myMultiMap ... <multimap defined here> myTree = new Tree('End2End') // my tree object // lets just pick the 'aaaa' to start with myMultiMap.get('aaaa').forEach((entry) => { newNode = new Tree(entry) myTree.appendChildNode(recurse(newNode)) }) // show the tree after it was built myTree.print()

función recursiva

 function recurse (node) { // if the element is in the multimap, it has one or more children if(myMultiMap.has(node.name)) { // iterate through all children of the node in the multimap myMultiMap.get(node.name).forEach((child) => { // build a new node from the child newChildnode = new Tree(child); // build a subtree recursively, since this child could have children itself return node.appendChildNode(recurse(newChildnode)) }) // if the node is not in the multimap, thus it has no children, so just return the node } else { return node } }

Información: tomé la implementación de este árbol: https://github.com/beforesemicolon/tutorials-files/blob/master/tree-generic.js

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

0

Usando una implementación de árbol trivial y usando un Mapa de cadenas a arreglos de cadenas en lugar de su implementación MultiMap, podemos ver la estructura con bastante claridad:

 const tree = (name, children) => ({name, children}) const mapToTree = (multiMap) => (root) => tree (root, (multiMap .get (root) || []) .map (mapToTree (multiMap))) const myMultiMap = new Map ([ ['aaaa', ['b', 'c', 'd']], ['c', ['f']], ['f', ['g']], ['r', ['p']] ]) console .log (mapToTree (myMultiMap) ('aaaa'))
 .as-console-wrapper {max-height: 100% !important; top: 0}

Si desea un nodo contenedor externo, End2End , podemos envolver una llamada más al tree :

 const myTree = tree ('End2End', mapToTree (myMultiMap) ('aaaa'))
about 4 years ago · Juan Pablo Isaza Relatório

0

El retorno dentro de forEach me da un 'indefinido'

Sí, no puede return de una devolución de llamada forEach . Pero eso no es lo que quieres hacer de todos modos. En cambio, después de realizar el ciclo, desea return node :

 function recurse(node) { if (myMultiMap.has(node.name)) { myMultiMap.get(node.name).forEach((child) => { const newChildnode = new Tree(child); node.appendChildNode(recurse(newChildnode)) }) return node; } else { return node; } }

o simplemente

 function recurse(node) { if (myMultiMap.has(node.name)) { myMultiMap.get(node.name).forEach((child) => { const newChildnode = new Tree(child); node.appendChildNode(recurse(newChildnode)) }) } return node; }

Alternativamente, no devuelva el nodo en absoluto, solo escriba

 function recurse(node) { if (myMultiMap.has(node.name)) { myMultiMap.get(node.name).forEach((child) => { const newChildnode = new Tree(child); recurse(newChildnode); node.appendChildNode(newChildnode); }) } }

o tal vez mejor, en su lugar, mueva la creación del nodo dentro de la función recurse :

 function recurse(name) { const node = new Tree(name); if (myMultiMap.has(name)) { myMultiMap.get(name).forEach((child) => { node.appendChildNode(recurse(child)) }) } return node; }

Por cierto, en su código principal no necesita duplicar el ciclo. simplificarlo a

 const myMultiMap = …; // multimap defined here const myTree = recurse(new Tree('aaaa')); myTree.print();

o para mi última versión, respectivamente

 const myMultiMap = …; // multimap defined here const myTree = recurse('aaaa'); myTree.print();
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