2017-09-17 136 views
0

我有一個對象,通過嵌套JSON對象像樹對象循環

var cObj = { 
    name: 'Object1', 
    oNumbers: 3, 
    leaf: [ 
    { 
     name: 'Inner Object 1', 
     oNumbers: 4, 
     leaf: [] 
    }, 
    { 
     name: 'Inner Object 2', 
     oNumbers: 9, 
     children: [ 
     { 
      name: 'Inner Object 1 2', 
      oNumbers: 2, 
      leaf: [] 
     } 
     ] 
    } 
    ] 
} 

我經歷了所有的節點要循環,並想打印 例如:

Object 1 
    Number 3 
     Inner Object 1 
     Number 4 

     Inner Object 2 
     Number 9 

     Inner Object 1 2 
     Number 2 

我當時就想,環通過使用遞歸但無法實現。有人可以指導我通過。

+0

[交通/過程可能重複(嵌套)對象,數組或JSON](https://stackoverflow.com/q/11922383/218196) –

+0

[Access/process(嵌套)對象,數組或JSON]的可能重複(https://stackoverflow.com/questions/11922383 /接入處理嵌套的對象陣列 - 或JSON) –

回答

0

如果結構如您所說,使用此功能。

function loop(parent, spaces) { 
    var output = ""; 
    spaces = spaces || 0; 
    if (parent.length>0 ) { 
     for(var index in parent) { 
      output += loop(parent[index], spaces+1); 
     } 
    } else { 

     for(var prop in parent) { 
      output +=" ".repeat(spaces) + prop + " : " 
      if (Array.isArray(parent[prop])) { 
       output +="\n";    
       output += loop(parent[prop],spaces+1); 
      } else { 
       output += parent[prop] + "\n"; 
      } 
     } 
    } 
    return output; 
} 

console.log(loop(cObj)); 
0

是的,你基本上可以寫一個遞歸函數來實現這一點。請檢查以下代碼片段:

var cObj = { 
 
    name: 'Object1', 
 
    oNumbers: 3, 
 
    leaf: [ 
 
    { 
 
     name: 'Inner Object 1', 
 
     oNumbers: 4, 
 
     leaf: [] 
 
    }, 
 
    { 
 
     name: 'Inner Object 2', 
 
     oNumbers: 9, 
 
     children: [ 
 
     { 
 
      name: 'Inner Object 1 2', 
 
      oNumbers: 2, 
 
      leaf: [] 
 
     } 
 
     ] 
 
    } 
 
    ] 
 
}; 
 

 
function printTree(root, level){ 
 
    
 
printValue(root.name, level); 
 
printValue('Number ' + root.oNumbers, level); 
 
    
 
var children; 
 
if(root.leaf == null) 
 
{ 
 
    children = root.children; 
 
} 
 
else 
 
{ 
 
    children = root.leaf; 
 
} 
 
    
 
if(children == null || children.length == 0){ 
 
    return; 
 
} 
 

 
for(var index = 0; index < children.length; index++){ 
 
    printTree(children[index], level + 1); 
 
} 
 
} 
 

 
function printValue(value, totalSpaces){ 
 
    var spaces = ' '; 
 
    for(var counter = 0; counter < totalSpaces; counter++){ 
 
    spaces += ' '; 
 
    } 
 
    
 
    console.log(spaces + value); 
 
} 
 

 
printTree(cObj, 0);

  • printTree(根級):打印根節點,它的每個孩子的調用相同的功能 遞歸。 level表示節點的級別,0表示最頂層/根對象。 由於對象可以包含葉子/子項,因此已經添加了空檢查,可以根據數據模型自由修改。

  • PRINTVALUE(值,totalSpaces):取顯示節點值之前打印的空間照顧(以獲得您所張貼的例子層級顯示)