Javascript 如何过滤多个对象的数组?

Javascript 如何过滤多个对象的数组?,javascript,arrays,object,filter,Javascript,Arrays,Object,Filter,我有一个多个对象的数组,这些对象是模拟的,并希望根据t_name_food进行过滤 this.lista\u categoria\u食品=[ { 编号:1, t_nome_分类:“主菜”, t_image:'Service.jpg', 食物清单:[ {n_id:1, 食物名称:“第1道菜”, 食品价格:20美元, n_数量:0, t_数量:'件'}, {n_id:2, 食物名称:“菜2”, 食品价格:20美元, n_数量:0, t_数量:'件'}, ] }, { 编号:2, t_nome_分类:

我有一个多个对象的数组,这些对象是模拟的,并希望根据t_name_food进行过滤

this.lista\u categoria\u食品=[
{
编号:1,
t_nome_分类:“主菜”,
t_image:'Service.jpg',
食物清单:[
{n_id:1,
食物名称:“第1道菜”,
食品价格:20美元,
n_数量:0,
t_数量:'件'},
{n_id:2,
食物名称:“菜2”,
食品价格:20美元,
n_数量:0,
t_数量:'件'},
]
},
{
编号:2,
t_nome_分类:“开胃菜”,
图片:“restaurant.jpg”,
食物清单:[
{n_id:1,
食物名称:“食物1”,
食品价格:20美元,
n_数量:0,
t_数量:'件'},
{n_id:2,
食物名称:“食物2”,
食品价格:20美元,
n_数量:0,
t_数量:'件'},
]
},
]
过滤器应重新运行与t_name_food匹配的产品列表

到目前为止,我们一直在尝试筛选对象的项

this.lista\u categoria\u food=this.filterFeeds.forEach((项目)=>{
项目列表\食品过滤器(e=>
{ 
if(e.t_name_food.toLowerCase().includes(searchTerm.toLowerCase())){
返回e;
} }) },

);您可以使用.filter方法筛选出所需的数据。 请尝试以下方法获取所需数据

let temp = this.lista_categoria_food.filter((data)=>{
 let temp1=[];
data.list_food.forEach((food)=>{
  if(food.t_name_food==this.myMatch)
  {temp1.push(food)}
   } 
  return temp1
  })

由t_name_food=>

let filtered = [];

this.lista_categoria_food.forEach(val => {
    val.list_food = val.list_food.filter(innerVal => {
         return innerVal.t_name_food.includes('dish 1')
       });
    if(val.list_food.length > 0) filtered.push(val);
});
现在filtered保存新数组,该数组只保存必要的t_name_食物

按特定字符串筛选=>

您可以按食物名称过滤,如下所示:

let filtered = this.lista_categoria_food.filter(val => {
    return val.list_food.filter(innerVal => {
        return innerVal.t_name_food === ('dish 1 ')}
    ).length > 0
});
外部过滤器按内部过滤器列表长度进行过滤。 我对盘子进行双重过滤

在上面的示例中,我用“dish 1”对其进行了过滤。

扩展:现在让列表的完整结构显示出来,只显示过滤的项目。

使用forEach在数组lista\u categoria\u food上进行迭代,然后从每个对象的属性列表\u food中筛选数组中的t\u name\u food。
如果至少有一个命中,则构建一个新的res对象,添加这些命中,并使用来自原始对象的其他键/值对完成该对象。收集所有这些物品并归还

功能食品过滤器(列表,食品){
让结果=[];
list.forEach(elem=>{
让list\u food=elem.list\u food.filter(obj=>obj.t\u name\u food==food);
如果(列出食物长度){
让res={list_food:list_food};
Object.keys(elem.map)(key=>{
如果(键!=“列出食物”)res[key]=elem[key];
});
结果:推送(res);
}
});
返回结果;
}
食品分类清单=[
{
编号:1,
t_nome_分类:“主菜”,
t_image:'Service.jpg',
食物清单:[
{n_id:1,
食物名称:“第1道菜”,
食品价格:20美元,
n_数量:0,
t_数量:'件'},
{n_id:2,
食物名称:“菜2”,
食品价格:20美元,
n_数量:0,
t_数量:'件'},
]
},
{
编号:2,
t_nome_分类:“开胃菜”,
图片:“restaurant.jpg”,
食物清单:[
{n_id:1,
食物名称:“食物1”,
食品价格:20美元,
n_数量:0,
t_数量:'件'},
{n_id:2,
食物名称:“食物2”,
食品价格:20美元,
n_数量:0,
t_数量:'件'},
]
},
];
console.log(foodFilter(食品分类列表,'food 2');
console.log(foodFilter(食品分类列表,'dish 1')使用和进行筛选:

const lista\u categoria\u food=[
{
编号:1,
t_nome_分类:“主菜”,
t_image:'Service.jpg',
食物清单:[
{n_id:1,
食物名称:“第1道菜”,
食品价格:20美元,
n_数量:0,
t_数量:'件'},
{n_id:2,
食物名称:“菜2”,
食品价格:20美元,
n_数量:0,
t_数量:'件'},
]
},
{
编号:2,
t_nome_分类:“开胃菜”,
图片:“restaurant.jpg”,
食物清单:[
{n_id:1,
食物名称:“食物1”,
食品价格:20美元,
n_数量:0,
t_数量:'件'},
{n_id:2,
食物名称:“食物2”,
食品价格:20美元,
n_数量:0,
t_数量:'件'},
]
},
];
const filtered=lista_categoria_food.filter({list_food})=>list_food.some({t_name_food})=>t_name_food==='food 1');

console.log(过滤)已编辑

此代码段允许您在输入字段中输入搜索字符串。生成的对象通过console.log在控制台中打印

[[在我的脚本中,“克隆”步骤是至关重要的!如果您不使用它,该函数一开始似乎可以工作,但在第一次筛选操作之后,源对象将永久更改。]]

const pre=document.querySelector('pre');
document.querySelector('input')。oninput=ev=>{
const res=food.map(f=>{
让ff={…f};//克隆每个f对象以供以后筛选
ff.list\u food=ff.list\u food.filter(lf=>//filter list\u food
lf.t_name_food.match(新RegExp(ev.target.value,'i'));
返回ff;})
console.log(res);//或者用它做任何你喜欢的事情。。。
}
常量食物=[
{
编号:1,
t_nome_分类:“主菜”,
t_image:'Service.jpg',
食物清单:[
{n_id:1,
食物名称:“第1道菜”,
食品价格:20美元,
n_数量:0,