通过嵌套的JSON对象循环,如树对象

时间:2017-09-17 04:45:12

标签: javascript 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

我正在考虑使用递归循环但无法实现。有人可以指导我完成。

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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(root,level):打印根节点并调用相同的函数                         递归地为它的每个孩子。 level表示节点的级别,0表示最顶层/根对象。 由于该对象可以包含叶子/子项,因此添加了空检查,可以根据数据模型进行修改。

  • printValue(value,totalSpaces):在显示节点值之前完成打印空格(在已发布的示例中获取分层显示)

相关问题