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

我有一个对象的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"

     }

]}

有没有办法实现连续过滤器的串联?


鸿蒙传说
浏览 407回答 3
3回答

慕村9548890

您可以将约束信息移到过滤器数组中,并通过检查所有(与条件)约束来进行过滤,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);

森栏

您可以使用过滤器,但是由于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的搜索

慕勒3428872

通过将过滤条件放置在外部阵列中,我们可以获得动态过滤。在我的示例中,它是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 blankconsole.log(getFilteredData(allData, filterCond));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript