javaScript过滤嵌套对象和数组

javaScript过滤嵌套对象和数组,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我的用例是这样的 我有一个数组,它有一个对象 每个对象都有一个名为menu 菜单数组再次表示反对 每个对象都有一个数组dish\u有\u个类别 在dish\u has_categories数组中,如果有一个CategoryId等于8的对象,我想过滤掉该根对象 我的原始数据对象 const数据=[{ menuName:“热狗”, 菜单:[ { 迪希德:“1”, 菜肴有以下几类:[{ 类别ID:'8' }] }, { 迪希德:“2”, 菜肴有以下几类:[{ 分类:“9” }] }] }, { me

我的用例是这样的

  • 我有一个数组,它有一个对象
  • 每个对象都有一个名为
    menu
  • 菜单数组再次表示反对
  • 每个对象都有一个数组
    dish\u有\u个类别
  • dish\u has_categories
    数组中,如果有一个CategoryId等于
    8
    的对象,我想过滤掉该根对象
  • 我的原始数据对象

    const数据=[{
    menuName:“热狗”,
    菜单:[
    {
    迪希德:“1”,
    菜肴有以下几类:[{
    类别ID:'8'
    }]
    },
    {
    迪希德:“2”,
    菜肴有以下几类:[{
    分类:“9”
    }]
    }]
    },
    {
    menuName:“汉堡”,
    菜单:[{
    迪希德:“3”,
    菜肴有以下几类:[{
    类别ID:'6'
    }]
    }, {
    迪希德:“4”,
    菜肴有以下几类:[{
    类别ID:'4'
    }]
    }]
    },
    {
    名称:“饮料”,
    菜单:[]
    }
    ]
    您可以使用嵌套

    some()
    方法测试数组中是否至少有一个元素通过了所提供函数实现的测试。它返回一个布尔值

    const data=[{menuName:“热狗”,菜单:[{dishId:'1',菜有[u类:[{CategoryId:'8'}]},{dishId:'2',菜有[u类:[{CategoryId:'9'}]},{menuName:'Burgers],菜单:[{dishId:'3',dish:'u有[u类:[{CategoryId:'6'}},{dishId:'4',dish:'u有[u类:[{CategoryId:'4'},},{,菜单:[]]
    const res=data.filter(x=>
    x、 菜单。一些(y=>
    y、 dish_有_类。一些(z=>z.CategoryId==='8')
    )
    );
    console.log(res)
    您可以使用和

    这里嵌套的一些用于检查
    dish\u是否有任何类别
    CategoryId
    等于
    '8'
    ,如果它是
    真的
    ,那么我们将在最终输出中包含该菜单,否则我们不会

    const data=[{menuName:“热狗”,菜单:[{disid:'1',disu有以下类别:[{CategoryId:'8'}}},,{disid:'2',dis'u有一个类:[{CategoryId:'9'}},,{menuName:'burgs,,,,,{menuName:burgs,菜单:[{disdisid:'3',dis菜有以下类型:[{CategoryId:'6'}}},,{disid:'4',disid'4',dis菜的类型有如下类型:[{CategoryId:'4''d,'d'd'u有如下类别:[{CategoryId:'},{name:“饮料”,菜单:[]]
    让op=data.filter(val=>{
    让menu=val.menu.some({dish\u has\u categories})=>dish\u has\u categories.some({CategoryId})=>CategoryId=='8'))
    返回菜单
    })
    console.log('筛选值-->\n',op)
    让names=op.map(({menuName})=>menuName)
    
    log('Names-->\n',Names)
    您可以使用javascript
    filter()
    some()
    some()
    方法检查数组中的任何元素是否通过该函数

    let data2 = data.filter(element => {
        let menu = element.menu.some(({dish_has_categories}) => dish_has_categories.some(({CategoryId}) => CategoryId === '8'));
        return menu;
               });
        console.log(data2); 
    

    谢谢。这管用!如果我想将此菜单名(“热狗”)推送到新的单独阵列。我在哪里可以做到这一点?@PathumSamarathna您想获取过滤值的名称还是所有值的名称?您可以简单地使用映射并仅从返回名称map@PathumSamararathna我还添加了在新数组中获取名称的示例,您可以查看:)总是很乐意提供帮助:)您好,请您解释一下,为什么要使用
    z.CategoryId=='8'
    ?8在这里是硬编码的。非常感谢。这管用!如果我想将此菜单名(“热狗”)推送到新的单独阵列。我在哪里可以做到这一点?@PathumSamararathna你可以使用
    map()
    ,因为我已经更新了它。@SyedMohamedAladeen,因为我问过)“在dish_中有_categories数组,如果有一个categorid等于8的对象,我想过滤掉那个根对象。”\n这回答了你的问题吗?