[英]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.