admin管理员组

文章数量:1192330

My use case is something like this.

  1. I have an array that has an object.
  2. That each object has an array called menu
  3. Again that menu array has objected.
  4. That each object has an array dish_has_categories
  5. In dish_has_categories array, if there is an object with CategoryId is equal to 8 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 use case is something like this.

  1. I have an array that has an object.
  2. That each object has an array called menu
  3. Again that menu array has objected.
  4. That each object has an array dish_has_categories
  5. In dish_has_categories array, if there is an object with CategoryId is equal to 8 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.

Share Improve this question edited Aug 31, 2022 at 15:44 isherwood 61k16 gold badges120 silver badges168 bronze badges asked May 30, 2019 at 4:40 margherita pizzamargherita pizza 7,14529 gold badges102 silver badges178 bronze badges 1
  • Does this answer your question? Filtering array of objects by searching nested object properties – Heretic Monkey Commented Feb 12, 2021 at 17:01
Add a comment  | 

3 Answers 3

Reset to default 18

You can use filter() with nested some().

The some() method tests whether at least one element in the array passes the test implemented by the provided function. It returns a Boolean value

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: [] } ]

const res = data.filter(x => 
                x.menu.some(y => 
                    y.dish_has_categories.some(z => z.CategoryId === '8')
                )
            );
console.log(res)

You can use filter and some

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)

You can use javascript filter() and some() . some() method checks if any of the elements in an array pass the function.

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); 

本文标签: How can I filter nested objects and arrays with JavaScriptStack Overflow