为了账号安全,请及时绑定邮箱和手机立即绑定

根据多种条件过滤对象的JSON数组

根据多种条件过滤对象的JSON数组

鸿蒙传说 2021-04-27 13:10:56
我有一个对象的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"     }]}如果筛选条件为:(查找orderNumbers包含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"     }]}如果筛选条件为:(查找orderNumber包含114的项目)然后输出:{  "items":[    {      "orderNumber": 1140,      "area": "APAC",      "category": "yellow",      "orderApprover": "Jake Smith"    }]}如果筛选条件为:(查找orderNumber包含10且区域包含EM的项目)然后输出:{  "items":[     {       "orderNumber": 1020,       "area": "EM-JAPAN",       "category": "red",       "orderApprover": "Paul Smith"     },     {       "orderNumber": 1013,       "area": "EMEA",       "category": "orange",       "orderApprover": "Mike Smith"     }]}有没有办法实现连续过滤器的串联?
查看完整描述

3 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

您可以将约束信息移到过滤器数组中,并通过检查所有(与条件)约束来进行过滤,Array#every如果需要或仅需一些约束(或条件),则采用Array#some。


var data = [{ 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" }],

    filters = [

        o => o.orderNumber.toString().includes('10'),

        o => o.area.includes('EM')

    ],

    result = data.filter(o => filters.every(fn => fn(o)));


console.log(result);


查看完整回答
反对 回复 2021-05-06
?
森栏

TA贡献1810条经验 获得超5个赞

您可以使用过滤器,但是由于orderNumber是整数toString,因此可以将其转换为字符串,然后用于includes检查值是否包含所需的数字


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"

    }

  ]

}




let data = allData.items.filter(item => item.orderNumber.toString().includes('10'));


console.log(data)

您可以进一步微调过滤器回调以集成对EM的搜索


查看完整回答
反对 回复 2021-05-06
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

通过将过滤条件放置在外部阵列中,我们可以获得动态过滤。在我的示例中,它是filterCond数组。


然后遍历过滤条件数组,并检查对象属性的每个值是否与同一索引中filterCond数组中的数据匹配。


如果条件为false,则增加一个计数器,如果counter大于0,则返回false。


应根据对象中键的索引放置条件。


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" }]};


function getFilteredData(allData, filterCond){

 return allData.items.filter((itm) =>{

  count = 0;

  filterCond.forEach((cond, idx) => {

     count = Object.values(itm)[idx].toString().includes(cond) === false ? count + 1: count;

  })

  return count === 0;

});

}

console.log("Filtering by orderNumber 10 and area EM");

let filterCond = ["10", "EM"];

console.log(getFilteredData(allData, filterCond));


console.log("Filtering by orderNumber 114");

filterCond = [114];

console.log(getFilteredData(allData, filterCond));


console.log("Filtering by only orderNumber 10");

filterCond = [10];

console.log(getFilteredData(allData, filterCond));


console.log("Filtering by only area APAC");

filterCond = [, "APAC"]; //leaving first criteria blank

console.log(getFilteredData(allData, filterCond));


查看完整回答
反对 回复 2021-05-06
  • 3 回答
  • 0 关注
  • 406 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信