我有一个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);
}
我需要一个最佳的方式来执行过滤
您可以减少数组并为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; }