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