Javascript嵌套JSON解析

时间:2017-03-23 09:41:14

标签: javascript html json

我有一个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"
},

]
}

Input Json Format

Output Json Format

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

作为替代方案,您可以使用此ES6函数,该函数使原始对象不可变,并将过滤后的版本创建为返回值:

&#13;
&#13;
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);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 2 :(得分: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); 
  }); 
}

答案 3 :(得分:0)

这是使用object-scan的解决方案。将头包裹起来后,它对数据处理非常强大。

let result = await Product.aggregate([
        {
            $lookup: {
                from: "purchaseorders",
                localField: "_id",
                foreignField: "items.product",
                as: "purchaseorders"
            }
        },
        {
            $lookup: {
                from: "salesorders",
                localField: "_id",
                foreignField: "items.product",
                as: "salesorders"
            }
        },
        {
            $unwind: "$purchaseorders"
        },
        {
            $unwind: "$purchaseorders.items"
        },
        {
            $unwind: "$salesorders"
        },
        {
            $unwind: "$salesorders.items"
        },
        {
            $group: {
                _id: "$_id"
            }
        }
        ])