Javascript 嵌套数组过滤,有没有更优雅的方法?

Javascript 嵌套数组过滤,有没有更优雅的方法?,javascript,arrays,filtering,Javascript,Arrays,Filtering,我正在尝试根据搜索字符串筛选嵌套结构 如果搜索字符串在某个项中匹配,那么我希望将该项及其父项保留在结构中 如果未找到搜索字符串,并且该项目没有子项,则可以对其打折 我已经编写了一些代码,使用递归数组过滤器检查每个项的子项: const数据={ id:'0.1', 儿童:[ { 儿童:[], id:'1.1' }, { id:'1.2', 儿童:[ { 儿童:[], id:'2.1' }, { id:'2.2', 儿童:[ { id:'3.1', 儿童:[] }, { id:'3.2', 儿童:

我正在尝试根据搜索字符串筛选嵌套结构

如果搜索字符串在某个项中匹配,那么我希望将该项及其父项保留在结构中

如果未找到搜索字符串,并且该项目没有子项,则可以对其打折

我已经编写了一些代码,使用递归数组过滤器检查每个项的子项:

const数据={
id:'0.1',
儿童:[
{
儿童:[],
id:'1.1'
},
{
id:'1.2',
儿童:[
{
儿童:[],
id:'2.1'
},
{
id:'2.2',
儿童:[
{
id:'3.1',
儿童:[]
},
{
id:'3.2',
儿童:[]
},
{
id:'3.3',
儿童:[]
}
]
},
{
儿童:[],
id:'2.3'
}
]
}
]
};
const searchString='3.3';
常量过滤器子项=(项)=>{
if(项.子项.长度){
item.children=item.children.filter(filterChildren);
返回项.children.length;
}
返回项目.id.includes(搜索字符串);
};
data.children=data.children.filter(filterChildren);
控制台日志(数据);
/*这将产生:
{
“id”:“0.1”,
“儿童”:[
{
“id”:“1.2”,
“儿童”:[
{
“id”:“2.2”,
“儿童”:[
{
“id”:“3.3”,
“儿童”:[]
}
]
}
]
}
]

}*/
一种非转换版本,用于搜索子级

函数查找(数组,id){
var child,
结果=数组.find(o=>o.id==id | |(child=find(o.children,id));
返回儿童
?Object.assign({},result,{children:[child]})
:结果;
}
常数
数据={id:'0.1',子项:[{children:[],id:'1.1'},{id:'1.2',子项:[{children:[],id:'2.1'},{id:'3.1',子项:[]},{id:'3.3',子项:[]},{children children id:[],id:'2.3'},{children,
searchString='3.3',
结果=查找([数据],搜索字符串);
控制台日志(结果)

。作为控制台包装{max height:100%!important;top:0;}
您正在修改数据。是有意的吗?递归是在任意嵌套级别进行迭代的唯一方法。@最晚您将“最简单的方法”拼错为“唯一的方法”;)@Teemu你可以建议其他方法(没有递归)?@hindmost我相信你可以使用循环和堆栈来代替递归结构。