2017-06-29 71 views
0

我需要從JSON中表示的數據構建樹形結構作爲對象和父級關係。我已經在下面的代碼中實現了成功完成這項工作的代碼,但我不確定它是否提供了最佳性能(我的意思是儘可能少地進行迭代)。提高使用JSON數據生成樹的遞歸性能

請注意,樹的根表示爲parentobject相同。例如{"object":"A", "parent":"A"}

關於任何其他具有更好性能的實現的建議將有所幫助!

var jsonInput = 
 
[ 
 
{"object":"A", "parent":"A"}, 
 
{"object":"B", "parent":"A"}, 
 
{"object":"C", "parent":"A"}, 
 
{"object":"D", "parent":"B"}, 
 
{"object":"E", "parent":"B"}, 
 
{"object":"F", "parent":"D"}, 
 
{"object":"G", "parent":"D"}, 
 
{"object":"H", "parent":"E"}, 
 
{"object":"I", "parent":"E"}, 
 
{"object":"J", "parent":"C"}, 
 
{"object":"K", "parent":"C"}, 
 
{"object":"L", "parent":"J"}, 
 
{"object":"M", "parent":"J"}, 
 
{"object":"N", "parent":"K"}, 
 
{"object":"O", "parent":"K"}, 
 
{"object":"P", "parent":"N"}, 
 
{"object":"Q", "parent":"N"}, 
 
{"object":"R", "parent":"O"}, 
 
{"object":"S", "parent":"O"} 
 
]; 
 

 
var root = getRoot(); 
 
root.childs = findChildrens(root); 
 

 
console.log("The tree hierarchy is:") 
 
console.log(root); 
 

 
function getRoot() { 
 
var root; 
 
for (var counter = 0; counter < jsonInput.length; counter++){ 
 
\t var item = jsonInput[counter]; 
 
\t if(item.object === item.parent) { 
 
\t \t root = item; 
 
\t \t break; 
 
\t } 
 
} 
 

 
var returnValue = JSON.parse(JSON.stringify(root)); 
 
root.visited = true; 
 
return returnValue; 
 
} 
 

 
function findChildrens(parentObject) { 
 
var childs = []; 
 
for (var counter = 0; counter < jsonInput.length; counter++){ 
 
\t var item = jsonInput[counter]; 
 
\t if(item.parent === parentObject.object && !item.visited) { 
 
\t \t var child = JSON.parse(JSON.stringify(item)); 
 
\t \t item.visited = true; 
 
\t \t child.childs = findChildrens(child); 
 
\t \t childs.push(child); 
 
\t } 
 
} 
 
return childs; 
 
}

+0

'{ 「對象」: 「A」, 「父」: 「A」}'這是怎麼反對自己的父母?那麼,從技術上講,你可以做到這一點,但它是正確的嗎? – Thomas

+0

是的,在我的情況下,對象的根將被表示爲'A'是'A'的父親 –

回答

-1

具有線性運行時更簡單的解決方案。

var data = [ 
 
    {"object":"A", "parent":"A"}, 
 
    {"object":"B", "parent":"A"}, 
 
    {"object":"C", "parent":"A"}, 
 
    {"object":"D", "parent":"B"}, 
 
    {"object":"E", "parent":"B"}, 
 
    {"object":"F", "parent":"D"}, 
 
    {"object":"G", "parent":"D"}, 
 
    {"object":"H", "parent":"E"}, 
 
    {"object":"I", "parent":"E"}, 
 
    {"object":"J", "parent":"C"}, 
 
    {"object":"K", "parent":"C"}, 
 
    {"object":"L", "parent":"J"}, 
 
    {"object":"M", "parent":"J"}, 
 
    {"object":"N", "parent":"K"}, 
 
    {"object":"O", "parent":"K"}, 
 
    {"object":"P", "parent":"N"}, 
 
    {"object":"Q", "parent":"N"}, 
 
    {"object":"R", "parent":"O"}, 
 
    {"object":"S", "parent":"O"} 
 
]; 
 

 
var rootNodes = data.filter(function(node) { 
 
    if (node.object in this) 
 
    throw new Error("duplicate object " + node.object); 
 

 
    this[node.object] = node; 
 
    node.children = []; 
 

 
    if (node.parent === node.object) return true; 
 
    var parent = this[node.parent]; 
 

 
    if (!parent) 
 
    throw new Error("invalid parent " + node.parent); 
 

 
    parent.children.push(node); 
 
}, Object.create(null)); 
 

 

 
console.log(rootNodes);
.as-console-wrapper { 
 
    top: 0; 
 
    max-height: 100%!important 
 
}

+0

謝謝。如果對象序列發生變化,我認爲這會失敗。例如如果在數組末尾移動「{」object「:」A「,」parent「:」A「}',它將失敗 –