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; }
我有一个 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; }