一个Javascript函数,用于过滤带有搜索项的树结构json。排除与搜索词不匹配的任何对象

一个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: [] },{

我有一个json,其结构可以达到n级深度:

[{
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;}