Javascript嵌套JSON解析
我有一个json对象,该对象包含主节点和嵌套节点。每个节点都有一个属性“type”,我想删除包含属性“type=doc”的nodes对象。请查找下面的json图像格式示例。我附上2个文件一个图像是输入格式,另一个是输出格式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": "
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);
});
}