2017-09-17 250 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):取显示节点值之前打印的空间照顾(以获得您所张贴的例子层级显示)