簡體   English   中英

基於多值對象過濾javascript對象數組

[英]Filter javascript objects array based on a multivalue object

需要根據具有由數組組成的多個值的過濾器對象過濾數組

    var vendors = [
      {
        vendor_name: "John",
        region: ["APAC", "UKDE"],
        scanned_status: "Yes",
        channel: ["FILE", "API"],
        pii_attributes: ["A", "B"]
      },
      {
        vendor_name: "Onir",
        region: ["APAC", "LATAM"],
        scanned_status: "No",
        channel: ["FILE"],
        pii_attributes: ["A", "C"]
      },
      {
        vendor_name: "Suresh",
        region: ["UKDE", "NA"],
        scanned_status: "Yes",
        channel: ["API"],
        pii_attributes: ["C", "B"]
      }
    ];

    var filterCriteria = {
      region: ["APAC", "LATAM"], // 'APAC', 'LATAM', 'NA', 'UKDE'
      channel: ["API"], // 'API', 'FILE'
      attributes: ["A", "B"],
      scan_status: "Yes" // 'Yes', 'No', 'All'
    };
    let filtered_vendors = [];
    var result = vendors.filter((el, index, arr) => {
      if (
        filterCriteria["region"].includes(el["region"]) &&
        filterCriteria["channel"].includes(el["channel"]) &&
        filterCriteria["attributes"].includes(el["pii_attributes"])
      ) {
        filtered_vendors.push(el);
        return true;
      }
      return false;
    });

    console.log(result);
    console.log(filtered_vendors);

但是我無法在過濾器級別應用多次迭代來包含元素。 想知道過濾數組的有效方法。

您也可以通過對filterCriteria使用相同的鍵來采用動態方法。

這種方法檢查過濾器值是否是一個數組並迭代這些值並檢查包含。

如果沒有數組,則直接比較值。

 var vendors = [{ vendor_name: "John", region: ["APAC", "UKDE"], scanned_status: "Yes", channel: ["FILE", "API"], pii_attributes: ["A", "B"] }, { vendor_name: "Onir", region: ["APAC", "LATAM"], scanned_status: "No", channel: ["FILE"], pii_attributes: ["A", "C"] }, { vendor_name: "Suresh", region: ["UKDE", "NA"], scanned_status: "Yes", channel: ["API"], pii_attributes: ["C", "B"] }], filterCriteria = { region: ["APAC", "LATAM"], channel: ["API"], pii_attributes: ["A", "B"], scanned_status: "Yes" }, filters = Object.entries(filterCriteria), result = vendors.filter(o => filters.every(([k, value]) => Array.isArray(value) ? value.some(v => o[k].includes(v)) // change to every if all have to match : o[k] === value )); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

var data = [{
    "id": 1,
    "term_id": 5,
    "type": "car"
  },
  {
    "id": 2,
    "term_id": 3,
    "type": "bike"
  },
  {
    "id": 3,
    "term_id": 6,
    "type": "car"
  }
];

var result = data.filter(function(v, i) {
  return ((v["term_id"] == 5 || v["term_id"] == 6) && v.type == "car");
})

console.log(result)

我不得不稍微解釋一下你的問題。 因此,在下面的代碼中,我們檢查每個過濾器是否過濾器屬性值的所有元素也在給定的供應商對象屬性中(基本上是子集操作)。 如果您的意思是每個過濾器的任何元素都需要使用交集操作。

為了實現這一點,我們可以使用reduce進行迭代並使用&& (函數isSupersetOf )總結各個檢查。 要將其應用於每個過濾器屬性,我們可以在條目集(函數isMatch )上應用相同的技術。

請注意,我還必須調整屬性名稱才能使其正常工作。

代碼:

 var vendors = [ { vendor_name: "John", region: ["APAC", "UKDE"], scanned_status: "Yes", channel: ["FILE", "API"], pii_attributes: ["A", "B"] }, { vendor_name: "Onir", region: ["APAC", "LATAM"], scanned_status: "No", channel: ["FILE"], pii_attributes: ["A", "C"] }, { vendor_name: "Suresh", region: ["UKDE", "NA"], scanned_status: "Yes", channel: ["API"], pii_attributes: ["C", "B"] }, // Add a match for illustration { vendor_name: "Denep", region: ["APAC", "LATAM", "NA"], scanned_status: ["Yes"], channel: ["API"], pii_attributes: ["A", "B", "C"] } ]; const filterCriteria = { region: ["APAC", "LATAM"], // 'APAC', 'LATAM', 'NA', 'UKDE' channel: ["API"], // 'API', 'FILE' pii_attributes: ["A", "B"], scanned_status: ["Yes"] // 'Yes', 'No', 'All' }; const isSupersetOf = (subset, superset) => subset.reduce((result, next) => result && superset.includes(next), true); const isMatch = (filter, element) => Object.entries(filter) .reduce((result, [property, values]) => result && isSupersetOf(values, element[property] || []), true) const filteredVendors = vendors.filter((el, index, arr) => isMatch(filterCriteria, el)) console.log(filteredVendors);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM