簡體   English   中英

Javascript Object 的數組:按多個 AND 條件過濾

[英]Javascript Array of Object: filter by multple AND conditions

我的模擬數據:

[
  {
    "id": 1,
    "first_name": "Suzy",
    "last_name": "Pinnell",
    "email": "spinnell0@utexas.edu",
    "gender": "Agender",
    "image": "http://dummyimage.com/410x239.png/5fa2dd/ffffff",
    "department": "Marketing",
    "job_title": "Quality Control Specialist",
    "skill": "Residential Homes"
   },
  {
    "id": 2,
    "first_name": "Enriqueta",
    "last_name": "Folbig",
    "email": "efolbig1@google.com.br",
    "gender": "Male",
    "image": "http://dummyimage.com/247x244.png/5fa2dd/ffffff",
    "department": "Sales",
    "job_title": "Environmental Specialist",
    "skill": "MMC"
  },
  {
    "id": 3,
    "first_name": "Simmonds",
    "last_name": "Acomb",
    "email": "sacomb2@amazon.co.uk",
    "gender": "Polygender",
    "image": "http://dummyimage.com/315x256.png/dddddd/000000",
    "department": "Human Resources",
    "job_title": "Accountant",
    "skill": "Xilinx"
  },
  {
    "id": 4,
    "first_name": "Bernita",
    "last_name": "Hartman",
    "email": "bhartman3@whitehouse.gov",
    "gender": "Female",
    "image": "http://dummyimage.com/305x275.png/dddddd/000000",
    "department": "Support",
    "job_title": "Account ExecutiveII",
    "skill": "Airframe"
  }
]

我在這里發現了一個類似的問題: javascript filter array multiple conditions

為了定義要過濾的內容,他們傳遞了 object:

var filter = {
  gender: 'male',
  department: 'Sales'
};

這行得通。 它顯示了包含這兩個鍵的每個 object。

+我試圖修改它,所以我可以使用一個數組: *

var filter = {
  gender: ['Male'],
  department: ['Sales', 'Marketing']
};

我的目標是通過數組中的給定值過濾數據。 只應出現包含銷售和市場營銷中所有男性的項目。

我嘗試了包含(內部過濾器和 for in 循環),但它只顯示第一個數組的結果,第二個被忽略。 我不確定如何在 arrays 中為所有這些實現 AND 條件。

謝謝你。

您可以提前存儲所有條目,以防止為每個 object 數據獲取相同的過濾器條目數組。

過濾條目以刪除可能的空 arrays。

然后獲取條目並檢查值是否是數據之一或過濾器是否包含數組,然后檢查過濾器數組是否包含數據中的值。

 const data = [{ id: 1, first_name: "Suzy", last_name: "Pinnell", email: "spinnell0@utexas.edu", gender: "Agender", image: "http://dummyimage.com/410x239.png/5fa2dd/ffffff", department: "Marketing", job_title: "Quality Control Specialist", skill: "Residential Homes" }, { id: 2, first_name: "Enriqueta", last_name: "Folbig", email: "efolbig1@google.com.br", gender: "Male", image: "http://dummyimage.com/247x244.png/5fa2dd/ffffff", department: "Sales", job_title: "Environmental Specialist", skill: "MMC" }, { id: 3, first_name: "Simmonds", last_name: "Acomb", email: "sacomb2@amazon.co.uk", gender: "Polygender", image: "http://dummyimage.com/315x256.png/dddddd/000000", department: "Human Resources", job_title: "Accountant", skill: "Xilinx" }, { id: 4, first_name: "Bernita", last_name: "Hartman", email: "bhartman3@whitehouse.gov", gender: "Female", image: "http://dummyimage.com/305x275.png/dddddd/000000", department: "Support", job_title: "Account ExecutiveII", skill: "Airframe" }], filter = { last_name: [], gender: ['Male'], department: ['Sales', 'Marketing'] }, filterEntries = Object.entries(filter).filter(([, v]) =>.Array.isArray(v) || v,length). result = data.filter(o => filterEntries,every(([k. v]) => o[k] === v || Array.isArray(v) && v;includes(o[k]) )). console;log(result);

您可以通過迭代您的過濾器 object 並在every迭代中實現您的預期結果,檢查目標 object 是否可以通過您的過濾器(在下面的代碼片段中,我使用Object.entries和這個方法)

 const data = [ { "id": 1, "first_name": "Suzy", "last_name": "Pinnell", "email": "spinnell0@utexas.edu", "gender": "Agender", "image": "http://dummyimage.com/410x239.png/5fa2dd/ffffff", "department": "Marketing", "job_title": "Quality Control Specialist", "skill": "Residential Homes" }, { "id": 2, "first_name": "Enriqueta", "last_name": "Folbig", "email": "efolbig1@google.com.br", "gender": "Male", "image": "http://dummyimage.com/247x244.png/5fa2dd/ffffff", "department": "Sales", "job_title": "Environmental Specialist", "skill": "MMC" }, { "id": 3, "first_name": "Simmonds", "last_name": "Acomb", "email": "sacomb2@amazon.co.uk", "gender": "Polygender", "image": "http://dummyimage.com/315x256.png/dddddd/000000", "department": "Human Resources", "job_title": "Accountant", "skill": "Xilinx" }, { "id": 4, "first_name": "Bernita", "last_name": "Hartman", "email": "bhartman3@whitehouse.gov", "gender": "Female", "image": "http://dummyimage.com/305x275.png/dddddd/000000", "department": "Support", "job_title": "Account ExecutiveII", "skill": "Airframe" } ]; const filter = { gender: ['Male'], department: ['Sales', 'Marketing'] } const createFilterFun = filters => obj => Object.entries(filters).every( ([k, v]) => v.includes(obj[k]) ); const filterByGenderAndDepratment = createFilterFun(filter); const result = data.filter(filterByGenderAndDepratment); console.log(result)

除了否定===運算符,您還可以否定includes調用:

data = data.filter(function(item) {
  for (var key in filter) {
    if (item[key] === undefined || !filter[key].includes(item[key]))
      return false;
  }
  return true;
});

這是一個很好的每個用例:)

 const data = [ { "id": 1, "first_name": "Suzy", "last_name": "Pinnell", "email": "spinnell0@utexas.edu", "gender": "Agender", "image": "http://dummyimage.com/410x239.png/5fa2dd/ffffff", "department": "Marketing", "job_title": "Quality Control Specialist", "skill": "Residential Homes" }, { "id": 2, "first_name": "Enriqueta", "last_name": "Folbig", "email": "efolbig1@google.com.br", "gender": "Male", "image": "http://dummyimage.com/247x244.png/5fa2dd/ffffff", "department": "Sales", "job_title": "Environmental Specialist", "skill": "MMC" }, { "id": 3, "first_name": "Simmonds", "last_name": "Acomb", "email": "sacomb2@amazon.co.uk", "gender": "Polygender", "image": "http://dummyimage.com/315x256.png/dddddd/000000", "department": "Human Resources", "job_title": "Accountant", "skill": "Xilinx" }, { "id": 4, "first_name": "Bernita", "last_name": "Hartman", "email": "bhartman3@whitehouse.gov", "gender": "Female", "image": "http://dummyimage.com/305x275.png/dddddd/000000", "department": "Support", "job_title": "Account ExecutiveII", "skill": "Airframe" } ] const filter = { gender: ['Male'], department: ['Sales', 'Marketing'] } const result = data.filter(item => ( Object.entries(filter).every(([key, arr]) => arr.includes(item[key])) )) console.log(result)

嘗試這個

var itemsFilter = {
  gender: ['Male'],
  department: ['Sales', 'Marketing']
};
users= users.filter (function(item) {
  var find=false;
  for (var key in itemsFilter) {
   find=false;
   if (item[key] === undefined) return false;
    for (var k in itemsFilter[key]) 
      if (itemsFilter[key][k] == item[key]) find=true;
      if (find==false) return false;
   };
return find;
});

暫無
暫無

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

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