JavaScript фильтрует вложенные объекты и массивы

Мой вариант использования примерно такой.

  1. У меня есть массив с объектом.
  2. Что у каждого объекта есть массив с именем menu
  3. Опять же, этот массив меню возражал.
  4. Что у каждого объекта есть массив dish_has_categories
  5. В массиве dish_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
})

Я понятия не имею, как глубоко фильтровать вложенные объекты и массивы. Надеюсь, мой вопрос вам всем ясен.

Отвечает ли это на ваш вопрос? Фильтрация массива объектов путем поиска свойств вложенных объектов

Heretic Monkey 12.02.2021 18:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
1
15 680
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать 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 здесь жестко закодирован.

Syed mohamed aladeen 30.05.2019 07:01

Большое спасибо. Это работает! Если я хочу поместить это имя меню («Хот-доги») в новый отдельный массив. Где я могу это сделать?

Pathum Kalhan 30.05.2019 07:02

@PathumSamararathna Вы можете использовать map() для того, что я обновил.

Maheer Ali 30.05.2019 07:10

@SyedMohamedAladeen Потому что ОП спросила) «В массиве блюд_has_categories, если есть объект с Категорийд равен 8, я хочу отфильтровать этот корневой объект».

Maheer Ali 30.05.2019 07:11
Ответ принят как подходящий

Вы можете использовать фильтр и немного

Здесь вложенные некоторые используются для проверки того, имеет ли какое-либо из 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)

Большое спасибо. Это работает! Если я хочу поместить это имя меню («Хот-доги») в новый отдельный массив. Где я могу это сделать?

Pathum Kalhan 30.05.2019 07:01

@PathumSamararathna вы хотите получить имена отфильтрованных значений или все значения? вы можете просто использовать карту и возвращать имя только с карты

Code Maniac 30.05.2019 07:03

@PathumSamararathna Я также добавил пример получения имен в новом массиве, который вы можете проверить :) всегда рад помочь :)

Code Maniac 30.05.2019 07:07

Вы можете использовать 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); 

Другие вопросы по теме