Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

129
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!