2017-03-23 19 views
0

私はオブジェクトにメインノードとネストされたノードを含むjsonオブジェクトを持っています。各ノードはプロパティ "type"を持っています。プロパティ "type = doc"を含むノードオブジェクトを削除したいと思います。以下の例のjsonイメージフォーマットを見つけてください。私は2つのファイルを添付しました.1つのイメージは入力フォーマットであり、他のイメージは出力フォーマットです。JavascriptネストされたJSON解析

var json = { 
"navigations": [ 
{ 
    "disp_order": "1", 
    "menu_id": "25266", 
    "nodes": [ 
    { 
     "disp_order": "2", 
     "menu_id": "18951", 
     "type": "DOC" 
    } 
    ], 
    "type": "MENU" 
}, 
{ 
    "disp_order": "20", 
    "menu_id": "25204", 
    "nodes": [ 
    { 
     "disp_order": "1", 
     "menu_id": "10295", 
     "type": "DOC" 
    }, 
    { 
     "disp_order": "10", 
     "menu_id": "25207", 
     "nodes": [ 
     { 
      "disp_order": "999", 
      "menu_id": "17250", 
      "type": "DOC" 
     }, 

     ], 
     "type": "MENU" 
    }, 
    { 
     "disp_order": "20", 
     "menu_id": "25209", 
     "nodes": [ 
     { 
      "disp_order": "999", 
      "menu_id": "18881", 
      "type": "DOC" 
     }, 

     ], 
     "type": "MENU" 
    }, 
    ], 
    "type": "MENU" 
}, 

] 
} 

Input Json Format

Output Json Format

+2

あなたが投稿した場合人々があなたを助けるためにのために容易になる質問 – Apollo

+3

を投稿する前に、あなたはそれを試してみる必要がありますJSONのイメージではなく実際のJSON私はそれを入力していません – George

+0

しかし、あなたは明らかにすでに2番目のイメージに従って出力形式を持っているので、すでに解決策があります。それはいくつかのコードです、それから何か問題があるかどうか尋ねるべきです。あなたが手でそれをした場合、JavaScriptだけであなたの思考プロセスをエンコードします。完了しました。 –

答えて

0

https://jsfiddle.net/1hoctvdp/

function deleteNonMenu(obj) { 
    if (obj.type == "DOC") { 
    return true; 
    } 
    if (obj.nodes) { 
    for (var i = 0; i < obj.nodes.length; i++) { 
     var res = deleteNonMenu(obj.nodes[i]); 
     if (res == true) { 
     delete obj.nodes[i]; 
     } 
    } 
    } 
    return false; 
} 

for (var i = 0; i < json.navigations.length; i++) { 
    var result = deleteNonMenu(json.navigations[i]); 
    if (result == true) { 
    delete json.navigations[i]; 
    } 
} 
console.log(json); 
+0

ありがとう@yriyas働いて –

+1

これは、 'nodes'配列に"ギャップ "(未定義)を生成します...フィードドで長さ1の最初の' nodes'配列をどのように取得するのかを見てください。私はこれが本当に望んでいるとは思わない。 – trincot

0

ただ、代替手段として、あなたは不変元のオブジェクトを残しており、このES6機能を使用し、そして濾過したバージョンなどを作成することができ戻り値:

function withoutDocNodes(obj) { 
 
    return Object(obj) !== obj ? obj // Primitive value: return w/o change 
 
     : Object.assign(Array.isArray(obj) ? [] : {}, // Create array or object 
 
      // With following properties: 
 
      ...Object.keys(obj) // For each property: 
 
       // Exclude those with DOC type in their value 
 
       .filter(key => Object(obj[key]).type !== 'DOC') 
 
       // Get recursive value (also without DOC types) 
 
       .map(key => [withoutDocNodes(obj[key]), key]) 
 
       // Exclude if resulting value is an empty (object or array) 
 
       .filter (([o]) => Object.keys(o).length) 
 
       // Produce key/value to add: arrays get index as property 
 
       .map(([o, key], i) => ({ [Array.isArray(obj) ? i : key]: o })) 
 
     ); 
 
} 
 

 
const obj = { 
 
    "navigations": [ 
 
    { 
 
     "disp_order": "1", 
 
     "menu_id": "25266", 
 
     "nodes": [ 
 
     { 
 
      "disp_order": "2", 
 
      "menu_id": "18951", 
 
      "type": "DOC" 
 
     } 
 
     ], 
 
     "type": "MENU" 
 
    }, 
 
    { 
 
     "disp_order": "20", 
 
     "menu_id": "25204", 
 
     "nodes": [ 
 
     { 
 
      "disp_order": "1", 
 
      "menu_id": "10295", 
 
      "type": "DOC" 
 
     }, 
 
     { 
 
      "disp_order": "10", 
 
      "menu_id": "25207", 
 
      "nodes": [ 
 
      { 
 
       "disp_order": "999", 
 
       "menu_id": "17250", 
 
       "type": "DOC" 
 
      }, 
 

 
      ], 
 
      "type": "MENU" 
 
     }, 
 
     { 
 
      "disp_order": "20", 
 
      "menu_id": "25209", 
 
      "nodes": [ 
 
      { 
 
       "disp_order": "999", 
 
       "menu_id": "18881", 
 
       "type": "DOC" 
 
      }, 
 

 
      ], 
 
      "type": "MENU" 
 
     }, 
 
     ], 
 
     "type": "MENU" 
 
    }, 
 
    ] 
 
}; 
 

 
const result = withoutDocNodes(obj); 
 

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

0

この1つはまた、このコードを試してみてください、働いている:

function mainFunction() { 
    var data = new Array(); 
    data = excludeDocs(json.navigations); 
} 

function excludeDocs(nodes) { 
    var _docs = new Array(); 
    $.each(nodes, function(index, node) { 
     if(typeof node === 'object') { 
      if(node.type === 'DOC') { 
       _docs.push(node.menu_id); 
      } 
      else if(typeof node.nodes === 'object') { 
       var _nodes = excludeDocs(node.nodes); 
       if(!(typeof nodes === 'object' && nodes.length > 0)) { 
        delete node.nodes; 
       } 
       else { 
        node.nodes = _nodes; 
       } 
      } 
     } 
    }); 
    return nodes.filter(function(n) { 
     return !_docs.includes(n.menu_id); 
    }); 
} 
関連する問題