Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据多个条件过滤对象的JSON数组_Javascript_Json - Fatal编程技术网

Javascript 根据多个条件过滤对象的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

我有一个对象的JSON数组。我正在创建一个过滤器来过滤这些数据

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计数确定是否有任何过滤条件不匹配。如果存在不匹配,则计数将不为零。有了它,我可以知道一些值在对象中不存在。