Javascript 如何过滤多个对象的数组?
我有一个多个对象的数组,这些对象是模拟的,并希望根据t_name_food进行过滤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_分类:
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,