Мой вариант использования примерно такой.
menudish_has_categoriesdish_has_categories, если есть объект с CategoryId, равным 8, я хочу отфильтровать этот корневой объект.Мой исходный объект данных
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: []
}
]Мой ожидаемый результат
[{
menuName: "Hot dogs",
menu: [
{
dishId: '1',
dish_has_categories: [{
CategoryId: '8'
}]
},
{
dishId: '2',
dish_has_categories: [{
CategoryId: '9'
}]
}]
}]
то, что я сделал до сих пор,
const data2 = data.filter(element => {
return element.menu.length > 0
})
Я понятия не имею, как глубоко фильтровать вложенные объекты и массивы. Надеюсь, мой вопрос вам всем ясен.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать filter() с вложенным 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.info(res)Привет, не могли бы вы объяснить, почему вы используете z.CategoryId === '8'? 8 здесь жестко закодирован.
Большое спасибо. Это работает! Если я хочу поместить это имя меню («Хот-доги») в новый отдельный массив. Где я могу это сделать?
@PathumSamararathna Вы можете использовать map() для того, что я обновил.
@SyedMohamedAladeen Потому что ОП спросила) «В массиве блюд_has_categories, если есть объект с Категорийд равен 8, я хочу отфильтровать этот корневой объект».
Вы можете использовать фильтр и немного
Здесь вложенные некоторые используются для проверки того, имеет ли какое-либо из dish_has_categoriesCategoryId равное '8', если это true, то мы включаем это меню в окончательный вывод, иначе мы не включаем
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.info('filtered values -->\n',op)
let names = op.map(({menuName})=> menuName)
console.info('Names --> \n', names)Большое спасибо. Это работает! Если я хочу поместить это имя меню («Хот-доги») в новый отдельный массив. Где я могу это сделать?
@PathumSamararathna вы хотите получить имена отфильтрованных значений или все значения? вы можете просто использовать карту и возвращать имя только с карты
@PathumSamararathna Я также добавил пример получения имен в новом массиве, который вы можете проверить :) всегда рад помочь :)
Вы можете использовать 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.info(data2);
Отвечает ли это на ваш вопрос? Фильтрация массива объектов путем поиска свойств вложенных объектов