簡體   English   中英

使用給定輸入的“AND”條件過濾數據

[英]Filtering data using 'AND' condition of inputs given

我面臨一個問題,我應該根據給定輸入的“&&”條件過濾數據。

要過濾的數據

let ssData={
         "0": {
             "OnPower": "no",
              "hazard": "no",
               "issues": "no",
               "OnGenerator": "no",
              "PermanentFuel": "no",
              "onDamage": "no"
      },
      "1": {
            "OnPower": "yes",
            "hazard": "yes",
            "issues": "no",
            "OnGenerator": "yes",
            "PermanentFuel": "no",
            "onDamage": "yes"
      },
      "2": {
            "OnPower": "no",
            "hazard": "no",
            "issues": "no",
            "OnGenerator": "yes",
            "PermanentFuel": "yes",
            "onDamage": "no"
      },
      "3": {
            "OnPower": "yes",
            "hazard": "yes",
            "issues": "yes",
            "OnGenerator": "yes",
            "PermanentFuel": "yes",
            "onDamage": "yes"
      },
      "4": {
            "OnPower": "no",
            "hazard": "yes",
            "issues": "no",
            "OnGenerator": "no",
            "PermanentFuel": "no",
            "onDamage": "yes"
      },
      "5": {
            "OnPower": "yes",
            "hazard": "no",
            "issues": "no",
            "OnGenerator": "yes",
            "PermanentFuel": "no",
            "onDamage": "no"
      },
      "6": {
            "OnPower": "yes",
            "hazard": "no",
            "issues": "yes",
            "OnGenerator": "no",
            "PermanentFuel": "no",
            "onDamage": "yes"
      }
}

過濾的輸入是:

 let filterData= ["OnPower","hazard","OnGenerator"]

過濾應該通過與“是”值進行比較並使用來自輸入的“AND”條件來完成

export function filterWithMultipleIssueData(ssData, filterData){
   let filteredSSData=[]
    ssData.map((row,index)=>{
        filterData.map((field)=>{
            if(row[field] == 'yes'){
                 filteredSSData.push(row.toJS())
            }
        })
    })
    return filteredSSData
}

在上面的函數中,我使用“OR”條件獲取過濾的SSData。(OnPower 'OR' hazard 'OR' OnGenerator)

比較應該與 OnPower 'AND' 危險 'AND' OnGenerator

The expected Output is:  

{
       "1": {
            "OnPower": "yes",
            "hazard": "yes",
            "issues": "no",
            "OnGenerator": "yes",
            "PermanentFuel": "no",
            "onDamage": "yes"
      },
      "3": {
            "OnPower": "yes",
            "hazard": "yes",
            "issues": "yes",
            "OnGenerator": "yes",
            "PermanentFuel": "yes",
            "onDamage": "yes"
      },
}

而不是使用的map上過濾你可能WANA使用every來代替:

 function filterYes(data, keys){
   return data.filter(data => keys.every(key => data[key] === "yes"));
 }

我猜你的數據是一個數組(因為你在它上面調用map )否則它有點復雜:

 function filterYes(data, key){
  return Object.assign({}, ...Object.entries(data).filter(([key, value]) =>
     keys.every(key => value[key] === "yes")
 ).map(([key, value]) => ({[key]: value}));
}

以下是使用higher-order函數的方法:

  • 地圖
  • 篩選
  • 降低

 let ssData={ "0": { "OnPower": "no", "hazard": "no", "issues": "no", "OnGenerator": "no", "PermanentFuel": "no", "onDamage": "no" }, "1": { "OnPower": "yes", "hazard": "yes", "issues": "no", "OnGenerator": "yes", "PermanentFuel": "no", "onDamage": "yes" }, "2": { "OnPower": "no", "hazard": "no", "issues": "no", "OnGenerator": "yes", "PermanentFuel": "yes", "onDamage": "no" }, "3": { "OnPower": "yes", "hazard": "yes", "issues": "yes", "OnGenerator": "yes", "PermanentFuel": "yes", "onDamage": "yes" }, "4": { "OnPower": "no", "hazard": "yes", "issues": "no", "OnGenerator": "no", "PermanentFuel": "no", "onDamage": "yes" }, "5": { "OnPower": "yes", "hazard": "no", "issues": "no", "OnGenerator": "yes", "PermanentFuel": "no", "onDamage": "no" }, "6": { "OnPower": "yes", "hazard": "no", "issues": "yes", "OnGenerator": "no", "PermanentFuel": "no", "onDamage": "yes" } }; let filterData= ["OnPower","hazard","OnGenerator"]; function filterDataFunction(dataToFilter, filterOptions) { return Object.getOwnPropertyNames(dataToFilter) .map(elem => ssData[elem]) // convert object to array .filter(data => filterOptions .map(filter => data[filter] === 'yes') // filter data where specified answers equal yes .reduce((first, second) => first && second)); // perform && on all elements of the array } console.log(filterDataFunction(ssData, filterData));

你沒有數組,但你可以用Object.entries().filter().reduce()來做到這一點。

let result = Object.entries(ssData)
  .filter(([_, o]) => filterData.every(k => o[k] === "yes"))
  .reduce((res, [k, o]) => Object.assign(res, {[k]: o}), {});

點擊演示:

 let ssData = { "0": { "OnPower": "no", "hazard": "no", "issues": "no", "OnGenerator": "no", "PermanentFuel": "no", "onDamage": "no" }, "1": { "OnPower": "yes", "hazard": "yes", "issues": "no", "OnGenerator": "yes", "PermanentFuel": "no", "onDamage": "yes" }, "2": { "OnPower": "no", "hazard": "no", "issues": "no", "OnGenerator": "yes", "PermanentFuel": "yes", "onDamage": "no" }, "3": { "OnPower": "yes", "hazard": "yes", "issues": "yes", "OnGenerator": "yes", "PermanentFuel": "yes", "onDamage": "yes" }, "4": { "OnPower": "no", "hazard": "yes", "issues": "no", "OnGenerator": "no", "PermanentFuel": "no", "onDamage": "yes" }, "5": { "OnPower": "yes", "hazard": "no", "issues": "no", "OnGenerator": "yes", "PermanentFuel": "no", "onDamage": "no" }, "6": { "OnPower": "yes", "hazard": "no", "issues": "yes", "OnGenerator": "no", "PermanentFuel": "no", "onDamage": "yes" } }; let filterData= ["OnPower","hazard","OnGenerator"]; let result = Object.entries(ssData) .filter(([_, o]) => filterData.every(k => o[k] === "yes")) .reduce((res, [k, o]) => Object.assign(res, {[k]: o}), {}); console.log(result);

我在這里看到多個答案。 一種接近你使用的代碼結構!

function filterWithMultipleIssueData(ssData, filterData){
   let filteredSSData= [];

      Object.keys(ssData).forEach((key)=> {
       let row = ssData[key];

       let filtered =  filterData.filter(field => row[field] == 'yes');  
       if(filtered.length == filterData.length) //filterData is the array you provided 
         filteredSSData.push(row);
    }); 
}

暫無
暫無

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

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