[英]Can I filter an array of objects in javascript with a substring?
我正在嘗試使用多個不同的過濾器過濾一組對象。 這目前適用於完全匹配,但不適用於使用子字符串進行過濾。 有沒有辦法簡單地修改這個過濾器函數以返回具有部分匹配的所有值?
nestedFilter(data, filters) {
let filterKeys = Object.keys(filters);
return data.filter(function (eachObj) {
return filterKeys.every(function (eachKey) {
if (!filters[eachKey].length) {
return true;
}
return filters[eachKey].includes(eachObj[eachKey]);
});
});
}
因此,使用以下數據和過濾器:
data = [
{
"NAME": "Johnathon",
"AGE": "19 ",
"GENDER": "M",
"SPORT": "Hockey",
"SCHOLARSHIP": "N"
},
{
"NAME": "Jessica",
"AGE": "20",
"GENDER": "F",
"SPORT": "Football",
"SCHOLARSHIP": "Y"
},
{
"NAME": "Matty",
"AGE": "20",
"GENDER": "NB",
"SPORT": "Tennis",
"SCHOLARSHIP": "Y"
},
{
"NAME": "Amy",
"AGE": "20",
"GENDER": "F",
"SPORT": "Football",
"SCHOLARSHIP": "N"
}
]
filters = [
{
"NAME": [],
"AGE": [],
"GENDER": [],
"SPORT": ["Foot", "Hockey"],
"SCHOLARSHIP": []
}
]
它應該返回 Johnathon、Jessica 和 Amy 對象。
(不同字段中的過濾器充當 AND,而同一字段中的過濾器充當 OR)。
要對對象的屬性使用部分匹配,您需要檢查該值是否至少包含過濾器列表中的一項。 例如:
"Footbal".includes("Foot") || "Football".includes("Hockey") // true;
我們可以使用Array.some來做出這個斷言:
return filters[eachKey].some(key => {
return eachObj[eachKey].includes(key);
});
一點修正:
filters
變量是一個數組,因此您可能希望將其轉換為對象或使用filters[0]
運行nestedFilter
filters[0]
函數( nestedFilter
中的第一項)
使用Array.reduce() ,AND 可以在每次迭代中實現
使用Array.some() ,可以為每個過濾器實現 OR
僅當數組不為空時才過濾。
var data = [ { "NAME": "Johnathon", "AGE": "19 ", "GENDER": "M", "SPORT": "Hockey", "SCHOLARSHIP": "N" }, { "NAME": "Jessica", "AGE": "20", "GENDER": "F", "SPORT": "Football", "SCHOLARSHIP": "Y" }, { "NAME": "Matty", "AGE": "20", "GENDER": "NB", "SPORT": "Tennis", "SCHOLARSHIP": "Y" }, { "NAME": "Amy", "AGE": "20", "GENDER": "F", "SPORT": "Football", "SCHOLARSHIP": "N" } ]; var filters = { "NAME": ["Amy"], "AGE": [], "GENDER": [], "SPORT": ["Foot", "Hockey"], "SCHOLARSHIP": ["Y","N"] }; var filterkeys = Object.keys(filters); var result = data.slice(0); filterkeys.forEach(function(filterkey){ if(filters[filterkey].length) { result = result.reduce(function(acc, value){ filters[filterkey].some(function(filtervalue){ return value[filterkey].indexOf(filtervalue)>-1; }) && acc.push(value); return acc; },[]); } }); console.log(result)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.