TypeScript 中嵌套对象的过滤器数组

时间:2021-04-14 14:07:49

标签: angular typescript filter

我有这个菜单和子菜单列表:

[
    {
        "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)));

但是我不能带着孙子!! 请你能帮帮我吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

你的问题有点误导。您想要减少菜单和子菜单,因此您需要进行减少,而不是过滤器。

不插入空的菜单并按方向过滤子菜单。

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;
},[]);