Javascript 根据多个条件过滤对象的JSON数组
我有一个对象的JSON数组。我正在创建一个过滤器来过滤这些数据Javascript 根据多个条件过滤对象的JSON数组,javascript,json,Javascript,Json,我有一个对象的JSON数组。我正在创建一个过滤器来过滤这些数据 var allData = { "items":[ { "orderNumber": 1010, "area": "JAPAN", "category": "orange", "orderApprover": "John Smith" }, { "orderNumber": 1020, "area": "EM-JAP
var allData = {
"items":[
{
"orderNumber": 1010,
"area": "JAPAN",
"category": "orange",
"orderApprover": "John Smith"
},
{
"orderNumber": 1020,
"area": "EM-JAPAN",
"category": "red",
"orderApprover": "Paul Smith"
},
{
"orderNumber": 1013,
"area": "EMEA",
"category": "orange",
"orderApprover": "Mike Smith"
},
{
"orderNumber": 1140,
"area": "APAC",
"category": "yellow",
"orderApprover": "Jake Smith"
}
]}
如果筛选条件为:(查找OrderNumber包含10的项目)
然后输出:
{
"items":[
{
"orderNumber": 1010,
"area": "JAPAN",
"category": "orange",
"orderApprover": "John Smith"
},
{
"orderNumber": 1020,
"area": "EM-JAPAN",
"category": "red",
"orderApprover": "Paul Smith"
},
{
"orderNumber": 1013,
"area": "EMEA",
"category": "orange",
"orderApprover": "Mike Smith"
}
]}
{
"items":[
{
"orderNumber": 1140,
"area": "APAC",
"category": "yellow",
"orderApprover": "Jake Smith"
}
]
}
{
"items":[
{
"orderNumber": 1020,
"area": "EM-JAPAN",
"category": "red",
"orderApprover": "Paul Smith"
},
{
"orderNumber": 1013,
"area": "EMEA",
"category": "orange",
"orderApprover": "Mike Smith"
}
]}
如果筛选条件为:(查找OrderNumber包含114的项目)
然后输出:
{
"items":[
{
"orderNumber": 1010,
"area": "JAPAN",
"category": "orange",
"orderApprover": "John Smith"
},
{
"orderNumber": 1020,
"area": "EM-JAPAN",
"category": "red",
"orderApprover": "Paul Smith"
},
{
"orderNumber": 1013,
"area": "EMEA",
"category": "orange",
"orderApprover": "Mike Smith"
}
]}
{
"items":[
{
"orderNumber": 1140,
"area": "APAC",
"category": "yellow",
"orderApprover": "Jake Smith"
}
]
}
{
"items":[
{
"orderNumber": 1020,
"area": "EM-JAPAN",
"category": "red",
"orderApprover": "Paul Smith"
},
{
"orderNumber": 1013,
"area": "EMEA",
"category": "orange",
"orderApprover": "Mike Smith"
}
]}
如果筛选条件为:(查找orderNumber包含10且区域包含EM的项目)
然后输出:
{
"items":[
{
"orderNumber": 1010,
"area": "JAPAN",
"category": "orange",
"orderApprover": "John Smith"
},
{
"orderNumber": 1020,
"area": "EM-JAPAN",
"category": "red",
"orderApprover": "Paul Smith"
},
{
"orderNumber": 1013,
"area": "EMEA",
"category": "orange",
"orderApprover": "Mike Smith"
}
]}
{
"items":[
{
"orderNumber": 1140,
"area": "APAC",
"category": "yellow",
"orderApprover": "Jake Smith"
}
]
}
{
"items":[
{
"orderNumber": 1020,
"area": "EM-JAPAN",
"category": "red",
"orderApprover": "Paul Smith"
},
{
"orderNumber": 1013,
"area": "EMEA",
"category": "orange",
"orderApprover": "Mike Smith"
}
]}
有没有办法实现连续过滤器的串联
编辑:我想让它更一般化
我已将过滤器字段值存储在状态对象中
this.state = {
orderNumberData: '',
areaData: '',
.
.
.
.
}
Array selectedFilters存储过滤器
像这样:
selectedFilters = [orderNumberData, areaData,........]
我现在如何迭代并实现所需的过滤器。我正在尝试遍历selectedFilters数组,并检查每个包含所需字符串的项。我不知道如何用基于选择过滤器数组的JSON对象字段填充空白。两者之间需要某种映射。假设selectedFilters[1]=orderNumberData,则orderNumber应该为空
for(var i=0; i<selectedFilters.length; i++) {
allData.items.filter(item => item.________.toString().includes(this.state[this.state.selectedFilters[i]]))
}
您可以使用筛选器,但由于
orderNumber
是一个整数,请使用toString
将其转换为字符串,然后使用includes
检查值是否包含所需的数字
var allData={
“项目”:[{
“订单号”:1010,
“地区”:“日本”,
“类别”:“橙色”,
“订单批准人”:“约翰·史密斯”
},
{
“订单号”:1020,
“区域”:“EM-JAPAN”,
“类别”:“红色”,
“订单批准人”:“Paul Smith”
},
{
“订单号”:1013,
“区域”:“EMEA”,
“类别”:“橙色”,
“订单审批人”:“迈克·史密斯”
},
{
“订单号”:1140,
“区域”:“亚太地区”,
“类别”:“黄色”,
“订单审批人”:“杰克·史密斯”
}
]
}
让data=allData.items.filter(item=>item.orderNumber.toString().includes('10');
console.log(data)
您可以将约束信息移动到筛选器数组中,并通过检查所有(和条件)约束来进行筛选,或者如果您只需要一些(或条件),则执行以下操作
var data=[{订单号:1010,地区:“日本”,类别:“橙色”,订单批准人:“约翰·史密斯”},{订单号:1020,地区:“EM-JAPAN”,类别:“红色”,订单批准人:“保罗·史密斯”},{订单号:1013,地区:“EMEA”,类别:“橙色”,订单批准人:“迈克·史密斯”},{订单号:1140,地区:“亚太地区”,类别:“黄色”,订单批准人:“杰克·史密斯”},
过滤器=[
o=>o.orderNumber.toString().includes('10'),
o=>o.area.includes('EM'))
],
结果=data.filter(o=>filters.every(fn=>fn(o));
console.log(result);
我们可以通过将筛选条件放置在外部数组中来完成动态筛选。在我的示例中,它是filterCond
数组
然后迭代过滤条件数组,检查对象属性的每个值是否与同一索引中的filterCond
数组中的数据匹配
如果条件为false,则递增计数器,如果计数器大于0,则返回false
应根据对象中键的索引放置标准
var allData={“items”:[{订单号:1010,地区:“日本”,类别:“橙色”,订单批准人:“约翰·史密斯”},{订单号:1020,地区:“EM-JAPAN”,类别:“红色”,订单批准人:“保罗·史密斯”},{订单号:1013,地区:“EMEA”,类别:“橙色”,订单批准人:“迈克·史密斯”},{订单号:1140,地区:“亚太地区”,类别:“黄色”,订单批准人:“Jake Smith”}]};
函数getFilteredData(allData,filterCond){
返回allData.items.filter((itm)=>{
计数=0;
filterCond.forEach((条件,idx)=>{
count=Object.values(itm)[idx].toString().includes(cond)==false?count+1:count;
})
返回计数===0;
});
}
日志(“按订单号10和区域EM过滤”);
让filterCond=[“10”,“EM”];
log(getFilteredData(allData,filterCond));
log(“按订单号114过滤”);
filterCond=[114];
log(getFilteredData(allData,filterCond));
log(“仅按订单号10过滤”);
filterCond=[10];
log(getFilteredData(allData,filterCond));
console.log(“仅按亚太地区过滤”);
filterCond=[,“亚太地区”]//将第一个条件留空
log(getFilteredData(allData,filterCond))代码>你应该查看一些关于过滤方法的文档,谢谢@ninascholz。在一个地方定义多个过滤器是一个很好的建议。我将尝试这种方法。谢谢@brk。将尝试为连续的筛选操作添加条件。请详细说明方法。这里计数的意义是什么?@Deepak-Laxkar计数确定是否有任何过滤条件不匹配。如果存在不匹配,则计数将不为零。有了它,我可以知道一些值在对象中不存在。