如何显示 JSON object 的 ID 和 children?

How can I show the IDs and children of a JSON object?

标题听起来不清楚,但我正在尝试在带有 ID 的警报中显示树的 JSON 如果 ID "has" children我会加children这个词,当"group"做完了,我会加一个|来表示群已经结束了,问题是我可以'当小组结束时,找不到添加 | 的方法。

所以,这棵树:

[
  {
    "name": "node1",
    "id": 1,
    "is_open" :true,
    "children": [
      {
        "name": "child2",
        "id": 3
      },
      {
        "name": "child2",
        "id": 7
      },
      {
        "name": "child1",
        "id": 2
      }
    ]
  },
  {
    "name": "node1",
    "id": 4,
    "is_open": true,
    "children": [
      {
        "name": "child2",
        "id": 5
      }
    ]
  }
]

会显示为:

1,children,3,7,2|4,children,5|

于是,我知道ID:1children,分别是ID:3ID:7ID:2,由于| 管道符号等等,但我不知道如何创建一些东西来检查和添加 |。你能帮帮我吗?

提前致谢。

我的代码:

var data = '[{"name":"node1","id":1,"is_open":true,"children":[{"name":"child2","id":3},{"name":"child2","id":7},{"name":"child1","id":2}]},{"name":"node1","id":4,"is_open":true,"children":[{"name":"child2","id":5}]}]';
var arrays = [];
//convert you string to object
//or you can simply change your first row.
data = $.parseJSON(data);
//function to loop the array
function listNodes(inputVal) {
  if (jQuery.isArray(inputVal)) {
    $.each(inputVal, function(i, elem) {
      arrays.push(elem.id);
      console.log(elem);
      if (jQuery.isArray(elem.children)) {
        arrays.push('children');
        listNodes(elem.children);
      }
    });
  }
}
listNodes(data);
alert(arrays);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

更新:

如果我得到两个或更多级别的children怎么办?

var data = JSON.parse('[{"name":"node1","id":1,"is_open":true,"children":[{"name":"child2","id":7},{"name":"child1","id":2,"is_open":true,"children":[{"name":"child2","id":3}]}]},{"name":"node1","id":4,"is_open":true,"children":[{"name":"child2","id":5}]}]');

var result = data.map(function(item) {
    return [item.id].concat('children', item.children.map(function(subitem) {
        return subitem.id;
    }));
}).join('|');

alert(result);

您不需要 jQuery。对于脚本的简化版本,您可以为此使用本机 Array.prototype.map with concat

var data = JSON.parse('[{"name":"node1","id":1,"is_open":true,"children":[{"name":"child2","id":3},{"name":"child2","id":7},{"name":"child1","id":2}]},{"name":"node1","id":4,"is_open":true,"children":[{"name":"child2","id":5}]}]');

var result = data.map(function(item) {
    return [item.id].concat('children', item.children.map(function(subitem) {
        return subitem.id;
    }));
}).join('|');

alert(result);

或者,如果您想查看自己的代码在修复后的外观:

function listNodes(inputVal) {
    if (jQuery.isArray(inputVal)) {
        $.each(inputVal, function (i, elem) {
            arrays.push(elem.id, ',');
            if (jQuery.isArray(elem.children)) {
                arrays.push('children,', elem.children.map(function(el) { return el.id; }));
            }
            arrays.push('|');
        });
    }
    arrays = arrays.join('');
}

试试这个:

var data = [{"name":"node1","id":1,"is_open":true,"children":[{"name":"child2","id":3},{"name":"child2","id":7},{"name":"child1","id":2}]},{"name":"node1","id":4,"is_open":true,"children":[{"name":"child2","id":5}]}];

var str = '';
//1,children,3,7,2|4,children,5|
$.each(data, function(i, item){
    if(item.id){
      str += item.id + ',children,'
       $.each(item.children, function(j, child){
          if(child.id){
             str += child.id;
             str += (j >= item.children.length-1) ? "|" : ",";
          }
         
      });
    }
});

alert(str);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

我已经为任何类型的 json 对象写了一个递归函数来分层打印.. 它在 java.. 你可以调整它来使用它..

static void printRecursive(JSONObject obj) {   
for(Object key:obj.keySet()) {
       //System.out.println(obj.get(key.toString()).getClass().getSimpleName());
        if(obj.get(key.toString()) instanceof JSONArray) {
            JSONArray aobj = ((JSONArray)obj.get(key.toString())); 

            for(int i=0;i<aobj.length();i++) {
                System.out.println(key.toString());
                printRecursive(aobj.getJSONObject(i));
            }
        }
        else
        if(obj.get(key.toString()) instanceof JSONObject) {
            System.out.println(key.toString());
            printRecursive((JSONObject)obj.get(key.toString()));
        }
        else
            System.out.println(key.toString()+" -> "+obj.get(key.toString()));
    }
}