Javascript操作对象数组并为数据和链接创建两组数组

Javascript操作对象数组并为数据和链接创建两组数组,javascript,arrays,json,Javascript,Arrays,Json,我有一个如下所示的对象数组 [ { "name": "car", "value": "", "children": [ { "name": "v8_engine", "value": "", "children": [ { "name": "cylinder-arrangement", "value": "", "c

我有一个如下所示的对象数组

 [
  {
    "name": "car",
    "value": "",
    "children": [
      {
        "name": "v8_engine",
        "value": "",
        "children": [
          {
            "name": "cylinder-arrangement",
            "value": "",
            "children": [
              {
                "name": "type",
                "value": "string",
                "children": []
              },
              {
                "name": "max-elements",
                "value": "8",
                "children": []
              }
            ]
          }
        ]
      },
      {
        "name": "other-parts",
        "value": "",
        "children": [
          {
            "name": "per-cylinder-parts",
            "value": "",
            "children": [
              {
                "name": "piston-diameter",
                "value": "",
                "children": [
                  {
                    "name": "type",
                    "value": "uint32",
                    "children": []

                  },
                  {
                    "name": "range",
                    "value": "2000... 9000",
                    "children": []

                  }
                ]
              },
              {
                "name": "valves",
                "value": "",
                "children": [
                  {
                    "name": "number",
                    "value": "",
                    "children": []
                  },
                  {
                    "name": "position",
                    "value": "",
                    "children": []
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
] 
我想解析每个元素及其各自的子元素,并对其进行操作以创建两组数组

  • 节点数据数组,包含:key,它是该元素和值的索引,如图所示
  • nodeDataArray.push({key:i,Data:a.yang_type+“”+a.name})或nodeDataArray.push({key:i,Data:a.name+“”+a.value})

  • 包含链接的链接数据数组(父子关系)

    push({from:i,to:j})

  • 其中i是父项的索引,j是子项的索引

    我有下面的函数,它解析元素并将它们精细地推送到带有索引的节点数据数组中

    vm.tree.forEach(loop);// here vm.tree is the json data, passed dynamically
     var i=0;
                        function loop(a) {
    
                            if(a.yang_type!='' && a.name!=''){
                              nodeDataArray.push({ key:i,Data: a.yang_type + " " + a.name, group: -1 });
                                //console.log("Data:",a.yang_type);
                                linkDataArray.push({ from: i, to: i+1 });
                          }
    
                            if(a.name!='' && a.value!=''){
                                nodeDataArray.push({ key:i,Data: a.name + " " + a.value, group: -1 });
                                linkDataArray.push({ from: 0, to: i+1 });
    
                            }
    
                            i=i+1;
                            // process you data
                            //if(Array.isArray(a.children)){j++;}
                            if(Array.isArray(a.children)){
    
                                //var g=0;
                                a.children.forEach(loop);
                            }
    
    
                        }
    
    下面的文字基于示例JSON,以便更清楚地说明我的预期输出应该是什么

  • 解析JSON并列出JSON对象中的所有元素,如下所示

    car
    v8_engine
    cylinder-arrangement
    type string 
    max-elements 8
    other_parts
    per-cylinder-parts
    piston-diameter
    type UINT32
    range 2000...3000
    valves
    number
    position
    
  • 然后根据父索引和子索引列出关系。其中汽车是第0个元素,v8_发动机是第2个元素,依此类推……直到最后一个元素位于第12位

  • 所以我们从上面的例子中总共有13个元素。现在我也需要列出他们的关系。像

    0th element is parent of 1 and 5.
    1st element is parent of 2
    2nd element is parent of 3 and 4
    and so on 
    

    要生成父列表,可以使用带有
    from
    变量的闭包,该变量保存从何处调用的节点号

    顺便说一句,您上面的列表对于
    5元素是6和10的父元素是不正确的。
    
    函数循环(从){
    返回函数(a){
    var f=i;
    如果(从!==未定义){
    push({from:from,to:i});
    }
    i++;
    if(Array.isArray(a.children)){
    a、 forEach(loop(f));
    }
    };
    }
    var数据=[{“名称”:“汽车”、“值”:“子项”:[{“名称”:“v8_引擎”、“值”:“子项”:[{“名称”:“气缸排列”、“值”:““子项”:[{“名称”:“类型”、“值”:“字符串”、“子项”:[]},{“名称”:“最大元素”、“值”:“8”、“子项”:[]}],{“名称”:“其他部分”、“值”:“,”子项:[“名称”:[{“名称”:“每缸零件”、“值”:”、“子项”:[{“名称”:“活塞直径”、“值”:“,”子项”:[{“名称”:“类型”、“值”:“uint32”,“子项”:[]},{“名称”:“范围”、“值”:“2000…9000”,“子项”:[]},{“名称”:“阀门”,“值”:“,”子项:[{“名称”:“编号”,“值”:“子项”:[]},{“位置”,“值”:”“:”“,”子项“:[]}]}]}]}]}],
    i=0,
    linkDataArray=[];
    data.forEach(loop());
    
    log(linkDataArray)
    要生成父列表,可以使用带有
    from
    变量的闭包,该变量保存从中调用的节点号

    顺便说一句,您上面的列表对于
    5元素是6和10的父元素是不正确的。
    
    函数循环(从){
    返回函数(a){
    var f=i;
    如果(从!==未定义){
    push({from:from,to:i});
    }
    i++;
    if(Array.isArray(a.children)){
    a、 forEach(loop(f));
    }
    };
    }
    var数据=[{“名称”:“汽车”、“值”:“子项”:[{“名称”:“v8_引擎”、“值”:“子项”:[{“名称”:“气缸排列”、“值”:““子项”:[{“名称”:“类型”、“值”:“字符串”、“子项”:[]},{“名称”:“最大元素”、“值”:“8”、“子项”:[]}],{“名称”:“其他部分”、“值”:“,”子项:[“名称”:[{“名称”:“每缸零件”、“值”:”、“子项”:[{“名称”:“活塞直径”、“值”:“,”子项”:[{“名称”:“类型”、“值”:“uint32”,“子项”:[]},{“名称”:“范围”、“值”:“2000…9000”,“子项”:[]},{“名称”:“阀门”,“值”:“,”子项:[{“名称”:“编号”,“值”:“子项”:[]},{“位置”,“值”:”“:”“,”子项“:[]}]}]}]}]}],
    i=0,
    linkDataArray=[];
    data.forEach(loop());
    
    log(linkDataArray)你的代码没有做你想做的事情?它做了保存节点数据数组的第一部分,但是链接数据数组没有基于JSON映射正确的父级和子级。这不是JSON,与JSON无关。请自学什么是JSON(参见JSON.org),并重写您的问题。此外,操作对象并不是“解析”它们。“解析”一词有特定的含义,即“根据语法分析一串符号的过程”。另外,请给出一个较小的示例数据集,并修复过度缩进。您的代码不符合您的要求?它完成了保存节点数据数组的第一部分,但链接数据数组没有基于JSON映射正确的父级和子级。这不是JSON,与JSON无关。请自学什么是JSON(参见JSON.org),并重写您的问题。此外,操作对象并不是“解析”它们。“解析”一词有特定的含义,即“根据语法分析一串符号的过程”。另外,请给出一个较小的示例数据集,并修复您的过度缩进。我看到您喜欢
    a&&do\u something
    习惯用法,但普通人编写
    if
    语句<代码>&&
    具有逻辑and的语义。此外,很多(如果不是大多数的话)Linter都会被这种语法扼杀。对,我喜欢这种简短的语法。现在好多了吗?谢谢你招待了一个脾气暴躁的老家伙。@torazaburo。。谢谢你,先生!!!我看你喜欢
    a&&do\u something
    这个成语,但是普通人写
    if
    语句<代码>&&
    具有逻辑and的语义。此外,很多(如果不是大多数的话)Linter都会被这种语法扼杀。对,我喜欢这种简短的语法。现在好多了吗?谢谢你招待了一个脾气暴躁的老家伙。@torazaburo。。谢谢你,先生!!!
                        var i=0;
                        var nodeDataArray = [];
                        var linkDataArray = [];
    
                        function loop(from) {           
                            return function (a) {
                                var f = i;
    
                                if(a.yang_type!='' && a.name!=''){
                                      nodeDataArray.push({ key:i,Data: a.yang_type + " " + a.name, group: -1 });
                                      //c=c+a.name;
                                      //console.log("c:",c);
                                    //console.log("Data:",a.yang_type);
                                    //linkDataArray.push({ from: i, to: i+1 });
                                  }
    
                                if(a.name!='' && a.value!=''){
                                    nodeDataArray.push({ key:i,Data: a.name + " " + a.value, group: -1 });
                                    //c=c+a.name+a.value;
                                    console.log("c:",c);
                                    //linkDataArray.push({ from: 0, to: i+1 });
    
                                }
                                if (from !== undefined) {
                                    linkDataArray.push({ from: from, to: i });
                                }
                                i++;
                                if (Array.isArray(a.children)) {
                                    a.children.forEach(loop(f));
                                }
                                //console.log("c:",c);
                            };
    
                        }
    var data = [{ "name": "car", "value": "", "children": [{ "name": "v8_engine", "value": "", "children": [{ "name": "cylinder-arrangement", "value": "", "children": [{ "name": "type", "value": "string", "children": [] }, { "name": "max-elements", "value": "8", "children": [] }] }] }, { "name": "other-parts", "value": "", "children": [{ "name": "per-cylinder-parts", "value": "", "children": [{ "name": "piston-diameter", "value": "", "children": [{ "name": "type", "value": "uint32", "children": [] }, { "name": "range", "value": "2000... 9000", "children": [] }] }, { "name": "valves", "value": "", "children": [{ "name": "number", "value": "", "children": [] }, { "name": "position", "value": "", "children": [] }] }] }] }] }]
    data.forEach(loop());