javaScript фильтр вложенные объекты и массивы - PullRequest
0 голосов
/ 30 мая 2019

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

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

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

Ответы [ 3 ]

3 голосов
/ 30 мая 2019

Вы можете использовать filter() с вложенным some().

Метод some() проверяет, прошел ли хотя бы один элемент в массиве тест, реализованный предоставленной функцией. Возвращает логическое значение

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)
1 голос
/ 30 мая 2019

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

Здесь вложенный элемент some используется для проверки того, имеет ли какой-либо из dish_has_categories значение CategoryId, равное '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.log('filtered values -->\n',op)

let names = op.map(({menuName})=> menuName)

console.log('Names --> \n', names)
0 голосов
/ 30 мая 2019

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