簡體   English   中英

Javascript 嵌套 JSON 解析

[英]Javascript Nested JSON Parsing

我有一個 json 對象,該對象包含主節點和嵌套節點。 每個節點都有一個屬性“type”,我想刪除包含屬性“type = doc”的節點對象。請在下面找到示例 json 圖像格式。 我附上了 2 個文件,一個圖像是輸入格式,另一個是輸出格式。

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"
},

]
}

輸入 Json 格式

輸出 Json 格式

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);

作為替代方案,您可以使用這個 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; }

這個也有效,試試這個代碼:

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); 
  }); 
}

這是使用object-scan的解決方案。 一旦你把頭環繞在它周圍,它對於數據處理來說是強大的。

注意: (1)期望表現良好的輸入和(2)就地修改輸入

 // const objectScan = require('object-scan'); const prune = (type, input) => { objectScan(['**.nodes[*].type'], { filterFn: ({ value, gparent, gproperty }) => { if (value === type) { gparent.splice(gproperty, 1); } } })(input); }; const 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' }] }; prune('DOC', json); console.log(json); // => { navigations: [ { disp_order: '1', menu_id: '25266', nodes: [], type: 'MENU' }, { disp_order: '20', menu_id: '25204', nodes: [ { disp_order: '10', menu_id: '25207', nodes: [], type: 'MENU' }, { disp_order: '20', menu_id: '25209', nodes: [], type: 'MENU' } ], type: 'MENU' } ] }
 .as-console-wrapper {max-height: 100% !important; top: 0}
 <script src="https://bundle.run/object-scan@16.0.0"></script>

免責聲明:我是對象掃描的作者

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM