2016-11-09 2 views
0

Ich versuche, einen Iterator auf JS zu bauen, der einen Baum nimmt und bei jeder Iteration den nächsten möglichen Teilbaum zurückbringt. HierWie teilt man einen Baum auf alle möglichen Unterbäume auf?

ist ein Beispiel für Quellbaum:

{ 
    name: 'A', 
    children: [ 
    { 
     name: 'B', 
     children: [ 
     { 
      name: 'E' 
     }, 
     { 
      name: 'F' 
     }, 
     ] 
    }, 
    { 
     name: 'C', 
    } 
    ] 
} 

Das Ergebnis sollte drei Iterationen

1. { 
    name: 'A', 
    children: [ 
    { 
     name: 'B', 
     children: [ 
     { 
      name: 'E' 
     } 
     ] 
    } 
    ] 
} 

2. { 
    name: 'A', 
    children: [ 
    { 
     name: 'B', 
     children: [ 
     { 
      name: 'F' 
     } 
     ] 
    } 
    ] 
} 

3. { 
    name: 'A', 
    children: [ 
    { 
     name: 'C', 
    } 
    ] 
} 

Könnte mir jemand einen Tip geben oder Punkt in die richtige Richtung, wie dieses Problem sein könnte gelöst?

Danke!

+0

Sie meinen, Sie alle möglichen Pfade zu dem Blatt von der Wurzel des Baumes sagen will? – abhishekkannojia

+0

Ich brauche eine Kopie des Baumes, wie in einem Beispiel – Dimitry

Antwort

0

denke ich, rekursive Funktion Ihre Antwort.

So ähnlich?

(Es funktionierte Ihr Beispiel mit)

var newtrees = []; 

var getTreeFromPath = function(path) { 
    var newtree = {}; 
    var next = newtree; 
    for (var i = 0 ; i < path.length;i++) { 
     next.name = path[i].name; 
     if (path[i].children) { 
      var nextIteration = {}; 
      next.children = [nextIteration]; 
     } 
     next = nextIteration; 
    } 
    return newtree; 

} 
var iterateNode = function(node, pathToNode) { 
    if (!node.children) { 
     pathToNode.push(node); 
     newtrees.push(getTreeFromPath(pathToNode)); 
    } else { 
     pathToNode.push(node); 
     for (var i = 0;i < node.children.length;i++) { 

      iterateNode(node.children[i], pathToNode); 
     } 
    } 
}; 
iterateNode(tree, []); 
+0

Vielen Dank. Ich habe Rekursion versucht, aber der Schlüsselpunkt war getTreeFromPath Funktion. Es funktioniert wie Sie es vorgeschlagen haben, ich habe es einfach mit Generatoren implementiert: http://jsbin.com/gojisapica/edit?js,console – Dimitry

0

Dies wird Ihnen helfen.

var arry=[]; 
 
var obj={ 
 
    name: 'A', 
 
    children: [ 
 
    { 
 
     name: 'B', 
 
     children: [ 
 
     { 
 
      name: 'E' 
 
     }, 
 
     { 
 
      name: 'F' 
 
     }, 
 
     ] 
 
    }, 
 
    { 
 
     name: 'C', 
 
    } 
 
    ] 
 
}; 
 
    for(i=0;i<obj.children.length;i++) 
 
    { 
 
    var newObj={name:obj.name,children:[{name:obj.children[i].name}]}; 
 
    if(obj.children[i].children){ 
 
     for(j=0;j<obj.children[i].children.length;j++) 
 
     { 
 
     var newObj={name:obj.name,children:[{name:obj.children[i].name,children:   []}]}; 
 
     newObj.children[i].children[0]= {name: obj.children[i].children[j].name}; 
 
     arry.push(newObj); 
 
     } 
 
} 
 
    else{ 
 
     arry.push(newObj); 
 
    } 
 
} 
 
for(k=0;k<arry.length;k++){ 
 
    console.log(arry[k]); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Verwandte Themen