angular - 在 TypeScript 中过滤嵌套对象数组
问题描述
我有这个菜单和子菜单列表:
[
{
"NUA_ID_Menu": 1,
"TXT_Nom_Menu": "Menu 1",
"Liste_Sous_Menus": [
{
"TXT_Nom_Menu": "SubMenu 1",
"Liste_Direction_Menu": [
{
"NUA_ID_Direction": 2,
"TXT_Nom_Direction": "Direction A"
},
{
"NUA_ID_Direction": 4,
"TXT_Nom_Direction": "Direction C"
}
]
},
{
"TXT_Nom_Menu": "SubMenu 2",
"Liste_Direction_Menu": [
{
"NUA_ID_Direction": 4,
"TXT_Nom_Direction": "Direction C"
}
]
},
{
"TXT_Nom_Menu": "SubMenu 3",
"Liste_Direction_Menu": [
{
"NUA_ID_Direction": 3,
"TXT_Nom_Direction": "Direction B"
}
]
}
]
},
{
"NUA_ID_Menu": 2,
"TXT_Nom_Menu": "Menu 2",
"Liste_Sous_Menus": [
{
"TXT_Nom_Menu": "SubMenu 4",
"Liste_Direction_Menu": [
{
"NUA_ID_Direction": 2,
"TXT_Nom_Direction": "Direction A"
},
{
"NUA_ID_Direction": 3,
"TXT_Nom_Direction": "Direction B"
}
]
}
]
}
]
例如,我想过滤包含包含方向 C 的子菜单的菜单。我想要这个结果,例如:
[
{
"NUA_ID_Menu": 1,
"TXT_Nom_Menu": "Menu 1",
"Liste_Sous_Menus": [
{
"TXT_Nom_Menu": "SubMenu 1",
"Liste_Direction_Menu": [
{
"NUA_ID_Direction": 2,
"TXT_Nom_Direction": "Direction A"
},
{
"NUA_ID_Direction": 4,
"TXT_Nom_Direction": "Direction C"
}
]
},
{
"TXT_Nom_Menu": "SubMenu 2",
"Liste_Direction_Menu": [
{
"NUA_ID_Direction": 4,
"TXT_Nom_Direction": "Direction C"
}
]
}
]
}
]
或者我想用带有方向数组的子菜单过滤菜单
我试过了:
this.mesMenus=res.filter(menu=>{
return menu.Liste_Sous_Menus.filter(ssmenu=>{
return ssmenu.Liste_Direction_Menu.filter(direction=>{
return direction.NUA_ID_Direction==2;
}).length>0;
}).length>0;
});
还
this.mesMenus = res.map(function(menu) {
menu.Liste_Sous_Menus = menu.Liste_Sous_Menus.map(function(ssmenu) {
ssmenu.Liste_Direction_Menu.filter(function(direction) {
return direction.NUA_ID_Direction==4;
});
return ssmenu;
});
return menu;
});
我可以和一个孩子一起过滤(这行得通)
const submenus = [ 6];
this.mesMenus =res.filter(d => d.Liste_Sous_Menus.every(c => submenus.includes(c.NUA_Id_Sous_Menu)));
但是有孙子我不能!请问你能帮我吗?谢谢你!
解决方案
你的问题有点误导。你想减少菜单和子菜单,所以你需要做一个减少,而不是一个过滤器。
不插入空菜单并按方向过滤子菜单。
const directions = [4];
this.mesMenus = res.reduce((arr, cur) => {
const submenus = cur.Liste_Sous_Menus
.filter(dir => dir.Liste_Direction_Menu
.some(m => directions
.some(d => m.NUA_ID_Direction == d)));
if(submenus.length > 0) {
cur.Liste_Sous_Menus = submenus;
arr.push(cur);
}
return arr;
},[]);
推荐阅读
- reactjs - 从 ApolloClient 的请求中获取 clientState 数据以用于 operation.setContext 反应 apollo graphql
- haskell - 迭代地构建 FGL 图删除边
- html - 定位页脚问题
- windows - 将数字批量回显到文本文件
- recursion - 从 C 代码到 MIPS 的递归斐波那契数列
- haproxy - HAProxy 超时保持活动与超时客户端
- python - 从网站动态解析时处理表中的非浮点数和 Nan 值
- amazon-web-services - AWS CodePipeline 将 Spring Boot 应用程序部署到 Elastic BeansTalk
- node.js - 在 Heroku 上部署 Node.js 错误:![remote denied] master -> master (pre-receive hook denied)
- node.js - 数组在 Nodejs 中使用 async 和 await 不返回任何内容