2016-11-09 61 views
0

我想在JS上構建一個迭代器,它需要一棵樹並在每次迭代時返回下一個可能的子樹。如何在所有可能的子樹上分割一棵樹?

這裏是源代碼樹的例子:

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

結果應該是三個迭代

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

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

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

可能有人給我一個提示,或指向的這個問題可能是如何在正確的方向解決了?

謝謝!

+0

你的意思是說,你想從根到樹的葉子所有可能的路徑? – abhishekkannojia

+0

我需要樹的副本,例如 – Dimitry

回答

0

我覺得遞歸函數是你的答案。

這樣的事情?

(它的工作使用你的例子)

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

非常感謝。我試過遞歸,但關鍵點是getTreeFromPath函數。它按照您的建議工作,我只是使用生成器重新實現它:http://jsbin.com/gojisapica/edit?js,console – Dimitry

0

這會幫助你。

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>