Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript嵌套JSON解析_Javascript_Html_Json - Fatal编程技术网

Javascript嵌套JSON解析

Javascript嵌套JSON解析,javascript,html,json,Javascript,Html,Json,我有一个json对象,该对象包含主节点和嵌套节点。每个节点都有一个属性“type”,我想删除包含属性“type=doc”的nodes对象。请查找下面的json图像格式示例。我附上2个文件一个图像是输入格式,另一个是输出格式 var json = { "navigations": [ { "disp_order": "1", "menu_id": "25266", "nodes": [ { "disp_order": "2", "menu_id": "

我有一个json对象,该对象包含主节点和嵌套节点。每个节点都有一个属性“type”,我想删除包含属性“type=doc”的nodes对象。请查找下面的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"
},

]
}

函数deleteNonMenu(obj){
如果(对象类型==“单据”){
返回true;
}
if(对象节点){
对于(变量i=0;i
作为替代,您可以使用此ES6函数,该函数使原始对象保持不变,并创建过滤后的版本作为返回值:

无DocNodes(obj)的函数{ 返回对象(obj)!==obj?obj//原语值:返回而不更改 :Object.assign(Array.isArray(obj)?[]:{},//创建数组或对象 //具有以下特性: …Object.keys(obj)//对于每个属性: //排除其值中包含文档类型的值 .filter(key=>Object(obj[key])。type!==“DOC”) //获取递归值(也没有文档类型) .map(key=>[withoutDocNodes(obj[key]),key]) //如果结果值为空(对象或数组),则排除 .filter(([o])=>Object.keys(o.length) //生成要添加的键/值:数组获取索引作为属性 .map(([o,key],i)=>({[Array.isArray(obj)?i:key]:o})) ); } 常量对象={ “导航”:[ { “分配顺序”:“1”, “菜单id”:“25266”, “节点”:[ { “分配顺序”:“2”, “菜单id”:“18951”, “类型”:“单据” } ], “类型”:“菜单” }, { “分配顺序”:“20”, “菜单id”:“25204”, “节点”:[ { “分配顺序”:“1”, “菜单id”:“10295”, “类型”:“单据” }, { “分配顺序”:“10”, “菜单id”:“25207”, “节点”:[ { “发布命令”:“999”, “菜单id”:“17250”, “类型”:“单据” }, ], “类型”:“菜单” }, { “分配顺序”:“20”, “菜单id”:“25209”, “节点”:[ { “发布命令”:“999”, “菜单id”:“18881”, “类型”:“单据” }, ], “类型”:“菜单” }, ], “类型”:“菜单” }, ] }; const result=无DOCnodes(obj); 控制台日志(结果)
。作为控制台包装{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); 
  }); 
}
下面是一个使用的解决方案。它的强大的数据处理,一旦你把你的头围绕它

注:(1)要求输入行为良好,(2)就地修改输入

//const objectScan=require('object-scan');
常量修剪=(类型,输入)=>{
objectScan(['**.nodes[*].type']{
filterFn:({value,gparent,gproperty})=>{
如果(值===类型){
gparent.拼接(gproperty,1);
}
}
})(输入);
};
const json={navigations:[{disp_-order:'1',menu-id:'25266',节点:[{disp_-order:'2',menu-id:'18951',type:'DOC'}],type:'menu'},{disp-order:'20',menu-id:'25204',节点:[{disp-order:'1',menu-id:'10295',type:'DOC DOC},{disp-id:'10',menu-id:'25207',节点:[disp-order:'999',menu-id:'17250',DOC,键入:'MENU'},{disp_order:'20',MENU-id:'25209',节点:[{disp_-order:'999',MENU-id:'18881',type:'DOC'}],type:'MENU'}],type:'MENU'}];
prune('DOC',json);
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'}
。作为控制台包装{最大高度:100%!重要;顶部:0}

在发布问题之前,您应该尝试一下。如果您发布的是实际的JSON而不是JSON的图像,人们会更容易帮助您。根据你的第二张图片,我不是在输入,你显然已经有了输出格式,所以已经有了解决方案。这是一些代码,然后你应该问它是否有任何问题。如果您是手工完成的,那么就用javascript编码您的思维过程。完成了。没有。我只是尝试在编辑器中显示输出,我需要脚本。提示!迭代JSON并复制/删除想要的/不想要的节点,就这么简单。这会在
节点
数组中产生“间隙”(未定义)。。。查看如何在小提琴中获得长度为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); 
  }); 
}