一个Javascript函数,用于过滤带有搜索项的树结构json。排除与搜索词不匹配的任何对象
我有一个json,其结构可以达到n级深度:一个Javascript函数,用于过滤带有搜索项的树结构json。排除与搜索词不匹配的任何对象,javascript,json,filter,tree,logic,Javascript,Json,Filter,Tree,Logic,我有一个json,其结构可以达到n级深度: [{ name: 'p1', child:[{ name: 'c1', child: [{ name: 'gc1', child: [] },{ name: 'gc2', child:[] }] },{ name: 'c2', child: [{ name: 'gc1', child: [] },{
[{
name: 'p1',
child:[{
name: 'c1',
child: [{
name: 'gc1',
child: []
},{
name: 'gc2',
child:[]
}]
},{
name: 'c2',
child: [{
name: 'gc1',
child: []
},{
name: 'gc2',
child:[]
}]
},{
name: 'c3',
child: [{
name: 'gc1',
child: []
},{
name: 'gc2',
child:[]
}]
}]},{
name: 'p2',
child:[{
name: 'c1',
child: [{
name: 'gc1',
child: []
},{
name: 'gc2',
child:[]
}]
},{
name: 'c2',
child: [{
name: 'gc1',
child: []
},{
name: 'gc2',
child:[]
}]
}]}]
案例1:如果搜索项为c1,则输出为
[{
name: 'p1',
child:[{
name: 'c1',
child: []
}]
},{
name: 'p2',
child:[{
name: 'c1',
child: []
}]
}]
[{
name: 'p1',
child:[{
name: 'c3',
child: []
}]
}]
[{
name: 'p1',
child:[]
}]
[{name: 'p1',child:[{
name: 'c1',
child: [{
name: 'gc1',
child: []
}]},{
name: 'c2',
child: [{
name: 'gc1',
child: []
}]},{
name: 'c3',
child: [{
name: 'gc1',
child: []
}]}]},{name: 'p2', child:[{
name: 'c1',
child: [{
name: 'gc1',
child: []
}]},{
name: 'c2',
child: [{
name: 'gc1',
child: []
}]}]}]
案例2:如果用户搜索c3,则输出为
[{
name: 'p1',
child:[{
name: 'c1',
child: []
}]
},{
name: 'p2',
child:[{
name: 'c1',
child: []
}]
}]
[{
name: 'p1',
child:[{
name: 'c3',
child: []
}]
}]
[{
name: 'p1',
child:[]
}]
[{name: 'p1',child:[{
name: 'c1',
child: [{
name: 'gc1',
child: []
}]},{
name: 'c2',
child: [{
name: 'gc1',
child: []
}]},{
name: 'c3',
child: [{
name: 'gc1',
child: []
}]}]},{name: 'p2', child:[{
name: 'c1',
child: [{
name: 'gc1',
child: []
}]},{
name: 'c2',
child: [{
name: 'gc1',
child: []
}]}]}]
案例3:如果用户搜索p1,则输出为
[{
name: 'p1',
child:[{
name: 'c1',
child: []
}]
},{
name: 'p2',
child:[{
name: 'c1',
child: []
}]
}]
[{
name: 'p1',
child:[{
name: 'c3',
child: []
}]
}]
[{
name: 'p1',
child:[]
}]
[{name: 'p1',child:[{
name: 'c1',
child: [{
name: 'gc1',
child: []
}]},{
name: 'c2',
child: [{
name: 'gc1',
child: []
}]},{
name: 'c3',
child: [{
name: 'gc1',
child: []
}]}]},{name: 'p2', child:[{
name: 'c1',
child: [{
name: 'gc1',
child: []
}]},{
name: 'c2',
child: [{
name: 'gc1',
child: []
}]}]}]
案例4如果用户搜索gc1,则输出为
[{
name: 'p1',
child:[{
name: 'c1',
child: []
}]
},{
name: 'p2',
child:[{
name: 'c1',
child: []
}]
}]
[{
name: 'p1',
child:[{
name: 'c3',
child: []
}]
}]
[{
name: 'p1',
child:[]
}]
[{name: 'p1',child:[{
name: 'c1',
child: [{
name: 'gc1',
child: []
}]},{
name: 'c2',
child: [{
name: 'gc1',
child: []
}]},{
name: 'c3',
child: [{
name: 'gc1',
child: []
}]}]},{name: 'p2', child:[{
name: 'c1',
child: [{
name: 'gc1',
child: []
}]},{
name: 'c2',
child: [{
name: 'gc1',
child: []
}]}]}]
请注意,如果子项名称不匹配,则输出中不包括该名称
我使用以下逻辑,但它不过滤“n”级节点:
function filterTree(data, matcher) {
data.child= data.child.filter(row => row.name === matcher);
for (nodeIndex in data.child)
filterTree(data.child[nodeIndex], matcher);
}
我需要一种执行筛选的最佳方法您可以减少数组并查找所需的名称或查找
子数组
的lock,如果找到对象,则添加实际对象和新的子数组
函数搜索(数组、名称){
常量s=(r,{child,…object})=>{
if(object.name==name){
r、 push({object,child:[]});
返回r;
}
child=child.reduce(s,[]);
if(child.length)r.push({…对象,child});
返回r;
};
返回数组。reduce(s,[]);
}
变量数据=[{name:'p1',child:[{name:'c1',child:[]},{name:'gc1',child:[]},{name:'gc1',child:[]},{name:'gc2',child:[]},{name:'gc1',child:[]},{name:'gc2',child:[]},{name:'p2 child:[{name:'c1',child:[]},{name:'gc1',child:[],{name:'gc2',child:[]},{name:'c2',child:[{name:'gc1',child:[]},{name:'gc2',child:[]}]};
日志(搜索(数据“c1”);
日志(搜索(数据'c3');
日志(搜索(数据“p1”);
日志(搜索(数据“gc1”)代码>
。作为控制台包装{最大高度:100%!重要;顶部:0;}