2016-06-22 3 views
0

私は以下のようなオブジェクト配列を持っています。示されるように、その要素と値の指標であるキー:オブジェクトの配列を操作し、データとリンクの2つの配列のセットを作成するJavaScript。

[ 
    { 
    "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": [] 
        } 
       ] 
       } 
      ] 
      } 
     ] 
     } 
    ] 
    } 
] 

Iは含まアレイの2つの設定

  1. ノードデータアレイを作成するために、各要素及びそれらのそれぞれの子供を解析し、それを操作します

nodeDataArray.push({key:i、Data:a.yang_type + "" + a.name})またはnodeDataArray.push({key:i、Data:a.name + "" + a。値})

  1. リンク(親子関係船)

    linkDataArray.pushが含ま

    リンクデータアレイ({から:I、へ:J})。私は親とjの指標である

の指標であるI要素を解析し、インデックスを持つノードデータ配列にして細かいそれらをプッシュし、以下の機能を持っています。文言以下

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経由

  1. 解析することとして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 
    
  2. 親子インデックスに基づく関係のリスト。車は0番目の要素である場合、v8_engineは第二とそうである...位置12日

だから我々は、上記の例から13個の要素の合計を持っていることである最後の1まで。今私は彼らの関係船もリストアップする必要があります。親リストを生成するには

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 
+1

あなたのコードは、あなたがやりたいことはありませんか? – Veverke

+0

最初の部分はノードデータ配列を保存しますが、リンクデータ配列はJSONに基づいて正しい親と子をマップしません – Nadvez

+0

これはJSONではなく、JSONとは関係ありません。 JSONの内容(json.orgを参照)を教えて、質問を書き直してください。また、オブジェクトを操作することはそれらを「解析する」こともありません。 「構文解析」という言葉は、「文法に従って記号列を解析するプロセス」という特定の意味を持っています。また、より小さなサンプルデータセットを与えて、あなたの過剰インデントを修正してください。 –

答えて

2

と同じように、あなたはそれが呼び出された場所からのノード番号を保持しているfrom変数、とクロージャを使用することができます。

ご参考までに、あなたの上記のリストは​​で正しくありません。

function loop(from) { \t \t \t 
 
    return function (a) { 
 
     var f = i; 
 
     if (from !== undefined) { 
 
      linkDataArray.push({ from: from, to: i }); 
 
     } 
 
     i++; 
 
     if (Array.isArray(a.children)) { 
 
      a.children.forEach(loop(f)); 
 
     } 
 
    }; 
 
} 
 

 
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": [] }] }] }] }] }], 
 
    i = 0, 
 
    linkDataArray = []; 
 

 
data.forEach(loop()); 
 

 
console.log(linkDataArray);

+0

あなたは 'a&do do_something'イディオムが好きですが、普通の人は' if'文を書いています。 '&&'は論理と論理の意味を持ちます。さらに、多くのリンターではないにしても、多くの場合、このシンタックスでは枯渇するでしょう。 –

+0

そうですね、私は短い構文が好きです。今はいいですか? –

+1

きれいな老人を収容してくれてありがとう。 –

0
    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()); 
関連する問題