連想配列と配列が組み合わさっているものの中身を表示させたい


下記のjsonのchidrenをすべて表示させたいのですが、どうすればよいでしょうか。  
childrenの中にchildrenがあり、childrenの個数が可変でも対応させたいです。

[code]

    {
        "children": [
        {
            "contents": {
                "A": 0,
                "B": 1,
                "C": 2
            },
                "children": [
                {
                    "children": [],
                    "name": "test03",
                    "id": 3
                },
                {
                    "children": [],
                    "name": "test04",
                    "id": 4
                }
                ],
                "name": "test01",
                "id": 1
        },
        {
            "contents": {
                "A": 0,
                "B": 1,
                "C": 2
            },
            "children": [
            {
                "children": [],
                "name": "test05",
                "id": 5
            },
            {
                "children": [],
                "name": "test06",
                "id": 6
            }
            ],
            "name": "test02",
            "id": 2
        }
        ]
    }
    
[/code]

得たい結果

[code]

     "name": "test01"
     "name": "test02"
     "name": "test03"
     "name": "test04"
     "name": "test05"
     "name": "test06"
    
[/code]




提示されているJSONは、多分木に分類される[木構造](https://ja.wikipedia.org/wiki/%E6%9C%A8%E6%A7%8B%E9%80%A0_\(%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0\))です。

もし表示する順番が 01 から 06 の昇順である必要があるなら、幅優先探索をするか、深さ優先探索で`name`を集めてからソートする必要があります。

幅優先探索だと以下のようなコードになるでしょう。`root` が JSON をパーズした結果のオブジェクトとします。

[code]

    function breadthFirstTraverse(root, callback) {
      const queue = [root];
      while (queue.length > 0) {
        const node = queue.shift();
        node.name && callback(node);
        queue.push(...node.children);
      }
    }
    
    breadthFirstTraverse(root, node => {
      console.log(`name: ${node.name}`);
    });
    
[/code]

深さ優先探索で表示順を気にしないなら少々シンプルなコードになります。

[code]

    function depthFirstTraverse(node, callback) {
      node.name && callback(node);
      node.children.forEach(child => depthFirstTraverse(child, callback));
    }
    
    depthFirstTraverse(root, node => {
      console.log(`"name": "${node.name}"`);
    });
    
[/code]




提示されているJSONは、多分木に分類される[木構造](https://ja.wikipedia.org/wiki/%E6%9C%A8%E6%A7%8B%E9%80%A0_\(%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0\))です。

もし表示する順番が 01 から 06 の昇順である必要があるなら、幅優先探索をするか、深さ優先探索で`name`を集めてからソートする必要があります。

幅優先探索だと以下のようなコードになるでしょう。`root` が JSON をパーズした結果のオブジェクトとします。

[code]

    function breadthFirstTraverse(root, callback) {
      const queue = [root];
      while (queue.length > 0) {
        const node = queue.shift();
        node.name && callback(node);
        queue.push(...node.children);
      }
    }
    
    breadthFirstTraverse(root, node => {
      console.log(`name: ${node.name}`);
    });
    
[/code]

深さ優先探索で表示順を気にしないなら少々シンプルなコードになります。

[code]

    function depthFirstTraverse(node, callback) {
      node.name && callback(node);
      node.children.forEach(child => depthFirstTraverse(child, callback));
    }
    
    depthFirstTraverse(root, node => {
      console.log(`"name": "${node.name}"`);
    });
    
[/code]

