【问题标题】:javaScript filter nested objects and arraysjavaScript 过滤嵌套对象和数组
【发布时间】:2019-10-15 17:23:41
【问题描述】:

我的用例是这样的。

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

我不知道如何在嵌套对象和数组中进行深度过滤。希望大家都清楚我的问题。

【问题讨论】:

标签: javascript arrays javascript-objects


【解决方案1】:

您可以将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)

【讨论】:

  • 嗨,你能解释一下,你为什么使用z.CategoryId === '8'吗? 8 在这里是硬编码的。
  • 非常感谢。这行得通!如果我想将此菜单名称(“热狗”)推送到新的单独数组。我在哪里可以做到这一点?
  • @PathumSamarathna 你可以使用map() 我已经更新了。
  • @SyedMohamedAladeen Becasue OP问)“在dish_has_categories数组中,如果有一个CategoryId等于8的对象我想过滤掉那个根对象。”_跨度>
【解决方案2】:

您可以使用filtersome

这里嵌套了一些用于检查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)

【讨论】:

  • 非常感谢。这行得通!如果我想将此菜单名称(“热狗”)推送到新的单独数组。我在哪里可以做到这一点?
  • @PathumSamarathna 您想获取过滤值或所有值的名称吗?您可以简单地使用地图并仅从地图返回名称
  • @PathumSamarathna 我已经添加了在新数组中获取名称的示例,您也可以查看 :) 总是乐于提供帮助 :)
【解决方案3】:

您可以使用 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); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    相关资源
    最近更新 更多