Javascript 查找满足嵌套JSON逻辑的最佳节点
下面是JSON,我使用它生成以下UI:Javascript 查找满足嵌套JSON逻辑的最佳节点,javascript,json,algorithm,tree,Javascript,Json,Algorithm,Tree,下面是JSON,我使用它生成以下UI: { "Text" : "1. Parent group" "Logic" : "all of the following", "Id":"1" //some unique id "children": [ { "Text' : "1.1 Level Child group" "Logic' : "1 or more of the following",
{
"Text" : "1. Parent group"
"Logic" : "all of the following",
"Id":"1" //some unique id
"children": [
{
"Text' : "1.1 Level Child group"
"Logic' : "1 or more of the following",
"Id':"1.1" //some unique id,
"children" : [
{
"Text' : "1.1.1 Level Child group"
"Logic' : "all of the following",
"Id':"1.1.1" //some unique id,
"children": [
{
"Text' : "1.1.1.1 Level Child"
"Id':"1.1.1.1" //some unique id,
},
{
"Text' : "1.1.1.2 Level Child"
"Id':"1.1.1.2" //some unique id,
"Logic" : "one or more of the following",
"children" : [
{
"Text": "1.1.1.2.1 Level Child",
"Id": "1.1.1.2.1"
},
{
"Text": "1.1.1.2.2 Level Child",
"Id": "1.1.1.2.2"
},
]
}
]
},
{
"Text' : "1.1.2 Level Child group"
"Id':"1.1.2" //some unique id,
},
{
"Text' : "1.1.3 Level Child group"
"Id':"1.1.3" //some unique id,
},
{
"Text' : "1.1.4 Level Child group"
"Logic' : "one or more of the following",
"Id':"1.1.4" //some unique id,
"children": [
{
"Text' : "1.1.4.1 Level Child"
"Id':"1.1.4.1" //some unique id,
},
{
"Text' : "1.1.4.2 Level Child"
"Id':"1.1.4.2" //some unique id,
}
]
},
{
"Text' : "1.1.5 Level Child group"
"Logic' : "all of the following",
"Id':"1.1.5" //some unique id,
"children": [
{
"Text' : "1.1.5.1 Level Child"
"Id':"1.1.5.1" //some unique id,
},
{
"Text' : "1.1.5.2 Level Child"
"Id':"1.1.5.2" //some unique id,
}
]
}
]
},
{
"Text" : "1.2 Level Child"
"Id":"1.2" //some unique id
}
]
}
1.父组(以下所有项)
1.1级子组(1个或更多)
1.1.1级别子组(以下所有项)
1.1.1.1级别子项//可选
1.1.1.2子级//可选
1.1.2子级//可选
1.1.3级别子级//可选
1.1.4级别子组(以下一项或多项)
1.1.4.1级别子级//可选
1.1.4.2级别子级//可选
1.1.5级别子组(以下所有内容)
1.1.5.1级别子级//可选
1.1.5.2级别子级//可选
1.2级子级//可选
节点工作逻辑:
我不确定应该使用哪种类型的算法来解决这个问题。这里是一个简短的方法,通过查看约束,现在在数据集中,这些约束与
q:'some'
或q:'every'
有关
功能选择(节点,已选择){
功能iter(节点){
如果(!node.children)返回[node.Id];
var-temp=节点子节点映射(iter);
if(node.q=='every')返回[…temp.flat(),node.Id];
var filtered=temp.filter(a=>a.some(v=>selected.includes(v));
if(filtered.length)返回[…filtered.flat(),node.Id];
返回[…temp.reduce((a,b)=>b.length!selected.includes(v));
}
var数据={q:'every',文本:“1.父组”,逻辑:“以下所有”,Id:'1',子组:[{q:'some',文本:“1.1级子组”,逻辑:“以下1个或多个”,Id:'1.1',子组:[{q:'every',文本:“1.1.1级子组”,逻辑:“以下所有”,Id:'1.1.1',子组:[{文本:“1.1.1.1级子组”,Id:'1.1.1.1”{Text:“1.1.1.2级儿童组”,Id:“1.1.1.2”},{Text:“1.1.2级儿童组”,Id:“1.1.2”},{Text:“1.1.3级儿童组”,Id:“1.1.3”},{q:“某些”,Text:“1.1.4级儿童组”,逻辑:“以下一个或多个”,Id:“1.1.4”,儿童:[{Text:“1.1.4.1级儿童组”,Id:“1.1.1.4.2级儿童组,{“1.1.4.2”},{q:“每一个”,文本:“1.1.5级儿童组”,逻辑:“所有以下”,Id:“1.1.5”,儿童:[{Text:“1.1.5.1级儿童”,Id:“1.1.5.1”},{Text:“1.1.5.2级儿童”,Id:“1.1.5.1”},{Text:“1.2级儿童”,Id:“1.2”};
log(选择(数据,[“1.2]”);
日志(选择(数据,[“1.2”,“1.1.1.1]”);
console.log(选择(数据,[“1.1.1.1]”);
。作为控制台包装器{max height:100%!important;top:0;}
您可以从添加有效数据开始。如何知道是否选择了节点?每次选择节点时,我都会在数组中维护节点id。它看起来如何?假设用户选择“1.2级子节点”。我所做的就是存储节点“id”“特定节点的。它看起来是这样的:[“1.2”]。如果希望添加名为“selected”的属性:根据选择或取消选择的节点,选择true或false。我能做到。如果用户选择某个东西,那么您从哪里获得所选节点?代码几乎可以完美地工作,除了应该给予直接子选择更多权重的用例之外。如果“1.1.1.2”有子项(参见更新的JSON),那么运行select(数据,[“1.1.2”,“1.1.1.2.2]”)应该返回[1.2,1];因为选择了“1.1.2”,所以已经满足了“1.1”。为了修复它,我在var filtered..
var all=node.q=='every',is1orMore=node.q=='some',childMetSoFar=0;if(node.children){node.children.forEach(function(child){if(!child.children&&selected.includes(child.Id)){childMetSoFar++}});if(is1orMore==true&&childMetSoFar>=1){return[];}
。但是选择失败(数据,[“1.2”,“1.1.4.2”])=>[],但返回[1.1,1]。对于第一个,为什么节点“1.1”
不在结果集中?是否应该在结果集中包含一些条件节点?您在这里指的是哪种情况?这一种select(data,[“1.1.2”,“1.1.1.2.2]”)
1. Parent group (all of the following)
1.1 Level Child group (1 or more )
1.1.1 Level Child group (all of the following)
1.1.1.1 Level Child // selectable
1.1.1.2 Level Child // selectable
1.1.2 Level Child // selectable
1.1.3 Level Child // selectable
1.1.4 Level Child group (one or more of the following)
1.1.4.1 Level Child // selectable
1.1.4.2 Level Child // selectable
1.1.5 Level Child group (all of the following)
1.1.5.1 Level Child // selectable
1.1.5.2 Level Child // selectable
1.2 Level Child // selectable