My use case is something like this.
- I have an array that has an object.
- That each object has an array called
menu
- Again that menu array has objected.
- That each object has an array
dish_has_categories
- In
dish_has_categories
array, if there is an object with CategoryId is equal to8
I want to filter out that root object.
My original data object
const data = [{ menuName: "Hot dogs", menu: [ { dishId: '1', dish_has_categories: [{ CategoryId: '8' }] }, { dishId: '2', dish_has_categories: [{ CategoryId: '9' }] }] }, { menuName: "Burgers", menu: [{ dishId: '3', dish_has_categories: [{ CategoryId: '6' }] }, { dishId: '4', dish_has_categories: [{ CategoryId: '4' }] }] }, { name: "Drinks", menu: [] } ]
My expect result is
[{ menuName: "Hot dogs", menu: [ { dishId: '1', dish_has_categories: [{ CategoryId: '8' }] }, { dishId: '2', dish_has_categories: [{ CategoryId: '9' }] }] }]
what I’ve done up to now is
const data2 = data.filter(element => { return element.menu.length > 0 })
I have no idea how to deep filter inside nested objects and arrays. Hope my question is clear to you all.
Advertisement
Answer
Here nested some is used to check whether any of dish_has_categories
has CategoryId
equal to '8'
, if it is true
then we include that menu in final output else we don’t
const data =[{ menuName: "Hot dogs", menu: [ { dishId: '1', dish_has_categories: [{ CategoryId: '8' }] }, { dishId: '2', dish_has_categories: [{ CategoryId: '9' }] }] }, { menuName: "Burgers", menu: [{ dishId: '3', dish_has_categories: [{ CategoryId: '6' }] }, { dishId: '4', dish_has_categories: [{ CategoryId: '4' }] }] }, { name: "Drinks", menu: [] } ] let op = data.filter(val => { let menu = val.menu.some(({dish_has_categories}) => dish_has_categories.some(({CategoryId}) => CategoryId === '8')) return menu }) console.log('filtered values -->n',op) let names = op.map(({menuName})=> menuName) console.log('Names --> n', names)