javascript - 使用 Javascript 遍历 JSON 以构建父子输出

标签 javascript json d3.js tree-traversal

我必须遍历下面的输入 JSON 来构建父子关系,如示例 JSON 中所示。

逻辑,immediate_parent_id为-1的元素成为根节点。比根节点immediate_dependents 是它的子节点。现在我必须选取immediate_dependents 的每个依赖项并查找匹配的node_id,并且特定元素immediate_dependents 成为其子元素。像这样我必须遍历到 JSON 的第 n 层。实现这一目标的最佳方法是什么。我不想使用 jQuery。期待使用 javascript 来解决。

输入 JSON

[
   {
      "node_id":1,
      "token":"Google",
      "posTag":"NNP",
      "depLabel":"compound",
      "node_role":{

      },
      "verb_info":[

      ],
      "action_verb_roleset":"",
      "parent_node":{
         "parent_node":2,
         "name":"News"
      },
      "entity_tag":{
         "originalTag":"B-ORG",
         "prefix":"B",
         "position":"begin",
         "mainCategory":"ORG",
         "entityDescription":"Organization",
         "examples":"Government Agency, Broadcaster, Company, Educational Institution, Employers Organization, Non-Profit Organization, Samba School, Sports League, Sports Team, Website"
      },
      "siblings":[

      ],
      "dependents":[

      ],
      "pobj_dependents":[

      ],
      "dobj_dependents":[

      ],
      "nobj_dependents":[

      ],
      "parents":[
         2,
         3
      ],
      "immediate_dependents":[

      ],
      "isRoot":false,
      "immediate_parent_id":2,
      "parentVerbID":3
   },
   {
      "node_id":2,
      "token":"News",
      "posTag":"NNP",
      "depLabel":"nsubj",
      "node_role":{
         "parent_verb_id":3,
         "grandparent_verb_id":3,
         "role":"topic"
      },
      "verb_info":[

      ],
      "action_verb_roleset":"be.01",
      "parent_node":{
         "parent_node":3,
         "name":"is"
      },
      "entity_tag":{
         "originalTag":"L-ORG",
         "prefix":"L",
         "position":"last",
         "mainCategory":"ORG",
         "entityDescription":"Organization",
         "examples":"Government Agency, Broadcaster, Company, Educational Institution, Employers Organization, Non-Profit Organization, Samba School, Sports League, Sports Team, Website"
      },
      "siblings":[
         6,
         12
      ],
      "dependents":[
         {
            "dependent":1,
            "name":"Google",
            "depLabel":"compound"
         }
      ],
      "pobj_dependents":[

      ],
      "dobj_dependents":[

      ],
      "nobj_dependents":[

      ],
      "parents":[
         3
      ],
      "immediate_dependents":[
         {
            "dependent":1,
            "name":"Google",
            "depLabel":"compound"
         }
      ],
      "isRoot":false,
      "immediate_parent_id":3,
      "parentVerbID":3
   },
   {
      "node_id":3,
      "token":"is",
      "posTag":"VBZ",
      "depLabel":"root",
      "node_role":{
         "parent_verb_id":3
      },
      "verb_info":[
         {
            "is_verb":true,
            "nodeID":3,
            "negation":null,
            "lemma":"be",
            "id":"be-109-1-1",
            "pbID":"be.01",
            "meaningUsage":"copula",
            "verb_synonyms":[
               "be",
               "prove",
               "appear",
               "seem"
            ]
         }
      ],
      "action_verb_roleset":"",
      "parent_node":{
         "parent_node":-1,
         "name":null
      },
      "entity_tag":null,
      "siblings":[

      ],
      "dependents":[
         {
            "dependent":2,
            "name":"News",
            "depLabel":"nsubj"
         },
         {
            "dependent":1,
            "name":"Google",
            "depLabel":"compound"
         },
         {
            "dependent":6,
            "name":"aggregator",
            "depLabel":"attr"
         },
         {
            "dependent":4,
            "name":"a",
            "depLabel":"det"
         },
         {
            "dependent":5,
            "name":"news",
            "depLabel":"compound"
         },
         {
            "dependent":7,
            "name":"and",
            "depLabel":"cc"
         },
         {
            "dependent":8,
            "name":"app",
            "depLabel":"conj"
         },
         {
            "dependent":9,
            "name":"developed",
            "depLabel":"acl"
         },
         {
            "dependent":10,
            "name":"by",
            "depLabel":"agent"
         },
         {
            "dependent":11,
            "name":"Google",
            "depLabel":"pobj"
         },
         {
            "dependent":12,
            "name":".",
            "depLabel":"punct"
         }
      ],
      "pobj_dependents":[
         {
            "dependent":11,
            "name":"Google",
            "depLabel":"pobj"
         }
      ],
      "dobj_dependents":[

      ],
      "nobj_dependents":[

      ],
      "parents":[

      ],
      "immediate_dependents":[
         {
            "dependent":2,
            "name":"News",
            "depLabel":"nsubj"
         },
         {
            "dependent":6,
            "name":"aggregator",
            "depLabel":"attr"
         },
         {
            "dependent":12,
            "name":".",
            "depLabel":"punct"
         }
      ],
      "isRoot":true,
      "immediate_parent_id":-1,
      "parentVerbID":-1
   },
   {
      "node_id":4,
      "token":"a",
      "posTag":"DT",
      "depLabel":"det",
      "node_role":{
         "role":"comment"
      },
      "verb_info":[

      ],
      "action_verb_roleset":"",
      "parent_node":{
         "parent_node":6,
         "name":"aggregator"
      },
      "entity_tag":null,
      "siblings":[
         5,
         7,
         8,
         9
      ],
      "dependents":[

      ],
      "pobj_dependents":[

      ],
      "dobj_dependents":[

      ],
      "nobj_dependents":[

      ],
      "parents":[
         6,
         3
      ],
      "immediate_dependents":[

      ],
      "isRoot":false,
      "immediate_parent_id":6,
      "parentVerbID":3
   },
   {
      "node_id":5,
      "token":"news",
      "posTag":"NN",
      "depLabel":"compound",
      "node_role":{
         "role":"comment"
      },
      "verb_info":[

      ],
      "action_verb_roleset":"",
      "parent_node":{
         "parent_node":6,
         "name":"aggregator"
      },
      "entity_tag":null,
      "siblings":[
         4,
         7,
         8,
         9
      ],
      "dependents":[

      ],
      "pobj_dependents":[

      ],
      "dobj_dependents":[

      ],
      "nobj_dependents":[

      ],
      "parents":[
         6,
         3
      ],
      "immediate_dependents":[

      ],
      "isRoot":false,
      "immediate_parent_id":6,
      "parentVerbID":3
   },
   {
      "node_id":6,
      "token":"aggregator",
      "posTag":"NN",
      "depLabel":"attr",
      "node_role":{
         "parent_verb_id":3
      },
      "verb_info":[

      ],
      "action_verb_roleset":"be.01",
      "parent_node":{
         "parent_node":3,
         "name":"is"
      },
      "entity_tag":null,
      "siblings":[
         2,
         12
      ],
      "dependents":[
         {
            "dependent":4,
            "name":"a",
            "depLabel":"det"
         },
         {
            "dependent":5,
            "name":"news",
            "depLabel":"compound"
         },
         {
            "dependent":7,
            "name":"and",
            "depLabel":"cc"
         },
         {
            "dependent":8,
            "name":"app",
            "depLabel":"conj"
         },
         {
            "dependent":9,
            "name":"developed",
            "depLabel":"acl"
         },
         {
            "dependent":10,
            "name":"by",
            "depLabel":"agent"
         },
         {
            "dependent":11,
            "name":"Google",
            "depLabel":"pobj"
         }
      ],
      "pobj_dependents":[
         {
            "dependent":11,
            "name":"Google",
            "depLabel":"pobj"
         }
      ],
      "dobj_dependents":[

      ],
      "nobj_dependents":[

      ],
      "parents":[
         3
      ],
      "immediate_dependents":[
         {
            "dependent":4,
            "name":"a",
            "depLabel":"det"
         },
         {
            "dependent":5,
            "name":"news",
            "depLabel":"compound"
         },
         {
            "dependent":7,
            "name":"and",
            "depLabel":"cc"
         },
         {
            "dependent":8,
            "name":"app",
            "depLabel":"conj"
         },
         {
            "dependent":9,
            "name":"developed",
            "depLabel":"acl"
         }
      ],
      "isRoot":false,
      "immediate_parent_id":3,
      "parentVerbID":3
   },
   {
      "node_id":7,
      "token":"and",
      "posTag":"CC",
      "depLabel":"cc",
      "node_role":{
         "role":"comment"
      },
      "verb_info":[

      ],
      "action_verb_roleset":"",
      "parent_node":{
         "parent_node":6,
         "name":"aggregator"
      },
      "entity_tag":null,
      "siblings":[
         4,
         5,
         8,
         9
      ],
      "dependents":[

      ],
      "pobj_dependents":[

      ],
      "dobj_dependents":[

      ],
      "nobj_dependents":[

      ],
      "parents":[
         6,
         3
      ],
      "immediate_dependents":[

      ],
      "isRoot":false,
      "immediate_parent_id":6,
      "parentVerbID":3
   },
   {
      "node_id":8,
      "token":"app",
      "posTag":"NN",
      "depLabel":"conj",
      "node_role":{
         "role":"comment"
      },
      "verb_info":[

      ],
      "action_verb_roleset":"",
      "parent_node":{
         "parent_node":6,
         "name":"aggregator"
      },
      "entity_tag":null,
      "siblings":[
         4,
         5,
         7,
         9
      ],
      "dependents":[

      ],
      "pobj_dependents":[

      ],
      "dobj_dependents":[

      ],
      "nobj_dependents":[

      ],
      "parents":[
         6,
         3
      ],
      "immediate_dependents":[

      ],
      "isRoot":false,
      "immediate_parent_id":6,
      "parentVerbID":3
   },
   {
      "node_id":9,
      "token":"developed",
      "posTag":"VBN",
      "depLabel":"acl",
      "node_role":{
         "parent_verb_id":9,
         "role":"comment"
      },
      "verb_info":[
         {
            "is_verb":true,
            "nodeID":9,
            "negation":null,
            "lemma":"develop",
            "id":"develop-26.1",
            "pbID":"develop.02",
            "meaningUsage":"create",
            "verb_synonyms":[
               "sculpt",
               "cut",
               "remake",
               "shape",
               "make",
               "carve",
               "build"
            ]
         }
      ],
      "action_verb_roleset":"",
      "parent_node":{
         "parent_node":6,
         "name":"aggregator"
      },
      "entity_tag":null,
      "siblings":[
         4,
         5,
         7,
         8
      ],
      "dependents":[
         {
            "dependent":10,
            "name":"by",
            "depLabel":"agent"
         },
         {
            "dependent":11,
            "name":"Google",
            "depLabel":"pobj"
         }
      ],
      "pobj_dependents":[
         {
            "dependent":11,
            "name":"Google",
            "depLabel":"pobj"
         }
      ],
      "dobj_dependents":[

      ],
      "nobj_dependents":[

      ],
      "parents":[
         6,
         3
      ],
      "immediate_dependents":[
         {
            "dependent":10,
            "name":"by",
            "depLabel":"agent"
         }
      ],
      "isRoot":false,
      "immediate_parent_id":6,
      "parentVerbID":-1
   },
   {
      "node_id":10,
      "token":"by",
      "posTag":"IN",
      "depLabel":"agent",
      "node_role":{
         "parent_verb_id":9,
         "grandparent_verb_id":9,
         "role":"creator"
      },
      "verb_info":[

      ],
      "action_verb_roleset":"develop.02",
      "parent_node":{
         "parent_node":9,
         "name":"developed"
      },
      "entity_tag":null,
      "siblings":[

      ],
      "dependents":[
         {
            "dependent":11,
            "name":"Google",
            "depLabel":"pobj"
         }
      ],
      "pobj_dependents":[
         {
            "dependent":11,
            "name":"Google",
            "depLabel":"pobj"
         }
      ],
      "dobj_dependents":[

      ],
      "nobj_dependents":[

      ],
      "parents":[
         9,
         6,
         3
      ],
      "immediate_dependents":[
         {
            "dependent":11,
            "name":"Google",
            "depLabel":"pobj"
         }
      ],
      "isRoot":false,
      "immediate_parent_id":9,
      "parentVerbID":9
   },
   {
      "node_id":11,
      "token":"Google",
      "posTag":"NNP",
      "depLabel":"pobj",
      "node_role":{

      },
      "verb_info":[

      ],
      "action_verb_roleset":"",
      "parent_node":{
         "parent_node":10,
         "name":"by"
      },
      "entity_tag":null,
      "siblings":[

      ],
      "dependents":[

      ],
      "pobj_dependents":[

      ],
      "dobj_dependents":[

      ],
      "nobj_dependents":[

      ],
      "parents":[
         10,
         9,
         6,
         3
      ],
      "immediate_dependents":[

      ],
      "isRoot":false,
      "immediate_parent_id":10,
      "parentVerbID":9
   }
]

示例 JSON 输出(用于渲染 d3 树)

   {  
   "name":"is",
   "children":[  
      {  
         "name":"news",
         "children":[  
            {  
               "name":"Google",
               "children":[  

               ]
            },
            {  
               "name":"aggregator",
               "children":[  
                  {  
                     "name":"a",
                     "children":[  

                     ]
                  },
                  {  
                     "name":"news",
                     "children":[  

                     ]
                  },
                  {  
                     "name":"app",
                     "children":[  

                     ]
                  },
                  {  
                     "name":"developed",
                     "children":[  
                        {  
                           "name":"by"
                        }
                     ]
                  }
               ]
            },
            {  
               "name":".",
               "children":[  

               ]
            }
         ]
      }
   ]
}

最佳答案

您可以采用迭代方法,将所有已知信息、父级和子级存储在一个对象中,然后获取根子级。

var data = [{ node_id: 1, token: "Google", parent_node: { parent_node: 2, name: "News" } }, { node_id: 2, token: "News", parent_node: { parent_node: 3, name: "is" } }, { node_id: 3, token: "is", parent_node: { parent_node: -1, name: null } }, { node_id: 4, token: "a", parent_node: { parent_node: 6, name: "aggregator" } }, { node_id: 5, token: "news", parent_node: { parent_node: 6, name: "aggregator" } }, { node_id: 6, token: "aggregator", parent_node: { parent_node: 3, name: "is" } }, { node_id: 7, token: "and", parent_node: { parent_node: 6, name: "aggregator" } }, { node_id: 8, token: "app", parent_node: { parent_node: 6, name: "aggregator" } }, { node_id: 9, token: "developed", parent_node: { parent_node: 6, name: "aggregator" } }, { node_id: 10, token: "by", parent_node: { parent_node: 9, name: "developed" } }, { node_id: 11, token: "Google", parent_node: { parent_node: 10, name: "by" } }],
    tree = function (data, root) {
        var o = {};
        data.forEach(function ({ node_id: id, token: name, parent_node: { parent_node: parent } }) {
            var temp = { name };
            if (o[id] && o[id].children) {
                temp.children = o[id].children;
            }
            o[id] = temp;
            o[parent] = o[parent] || {};
            o[parent].children = o[parent].children || [];
            o[parent].children.push(temp);

        });
        return o[root].children;
    }(data, -1);

console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 使用 Javascript 遍历 JSON 以构建父子输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52848714/

相关文章:

javascript - mongodb不插入完整数组

javascript - ajax 调用后多选不起作用

javascript - 使用 D3.js 可视化世界地图但无法可视化 json 文件

javascript - 循环间隔超时

javascript - 使用自定义匹配器的 jasmine 2.0 测试失败 : undefined is not a function

php - 使用 theMovieDB 通过 PHP 显示图像海报

javascript - 在 Node.js 中解析大型 XML 文件

json - Pig脚本/命令过滤特定字符串上的文件

javascript - 使用 d3.js 为 svg 图表创建标记

d3.js - 在 D3 符号 map 上绘制连接线 ("Great Arcs")