Javascript 函数,用于使用搜索词过滤树结构 json。排除任何与搜索词不匹配的 object

A Javascript function to filter tree structured json with a search term. exclude any object which donot match the search term

我有一个 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:[]
    }]
}]}]

情况一:如果搜索词是c1,输出是

[{
    name: 'p1',
    child:[{
        name: 'c1',
        child: []
    }]
},{
    name: 'p2',
    child:[{
        name: 'c1',
        child: []
    }]
}]

情况2:如果用户搜索c3,输出为

[{
    name: 'p1',
    child:[{
        name: 'c3',
        child: []
    }]
}]

情况3:如果用户搜索p1,输出为

[{
    name: 'p1',
    child:[]
}]

案例4如果用户搜索gc1,输出为

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

请注意,如果 children 名称不匹配,则它不会包含在输出中。

我正在使用以下逻辑,但它不会过滤节点 'n' 级别:

function filterTree(data, matcher) {
    data.child= data.child.filter(row => row.name === matcher);
    for (nodeIndex in data.child)
        filterTree(data.child[nodeIndex], matcher);

}

我需要一种执行过滤的最佳方式

您可以减少数组并查找想要的名称或查找 child 数组,如果找到对象,则将实际对象添加到新的子数组中。

function search(array, name) {
    const s = (r, { child, ...object }) => {
        if (object.name === name) {
            r.push({ object, child: [] });
            return r;
        }
        child = child.reduce(s, []);
        if (child.length) r.push({ ...object, child });
        return r;
    };
    return array.reduce(s, []);
}

var data = [{ 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: [] }] }] }];

console.log(search(data, 'c1'));
console.log(search(data, 'c3'));
console.log(search(data, 'p1'));
console.log(search(data, 'gc1'));
.as-console-wrapper { max-height: 100% !important; top: 0; }