繁体   English   中英

javaScript过滤嵌套对象和数组

[英]javaScript filter nested objects and arrays

我使用的情况是这样的。

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

我不知道如何在嵌套对象和数组内部进行深度过滤。 希望我的问题是清楚你所有。

您可以使用带有嵌套some() 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) 

您可以使用过滤器一些

这里嵌套一些用来检查是否有任何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) 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM