提问者:小点点

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


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

情况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 name不匹配,则输出中不包括它。

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

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

}

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


共1个答案

匿名用户

您可以减少数组并为child数组查找所需的名称或loock,如果找到对象,则添加具有新子数组的实际对象。

null

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