使用多个筛选条件筛选对象数组



假设我有一个对象数组:

let users = [{
name: "Mark",
location: "US",
job: "engineer"
},
{
name: "Mark",
location: "US",
job: "clerk"
},
{
name: "Angela",
location: "Europe",
job: "pilot"
}, 
{
name: "Matthew",
location: "US",
job: "engineer"
}]

我有一个过滤器对象,里面有我想要过滤数据的所有类别(每个键可以有多个值(:

const filters = {
name: ["Mark", "Matthew"],
location: ["US"],
job: ["Engineer"]
}

基于这些过滤器和数据,预期结果将返回:

[{name: "Mark", location: "US", job: "Engineer"}, {name: "Matthew", location: "US", job: "Engineer"}]

我尝试过使用进行过滤

users.filter(user => {
for(let k in filters) {
if(user[k] === filters[k]) {
return true;
}
}
})

然而,这个方法没有考虑到一个过滤器类别可能包含多个值,我可以通过以下操作来处理:

filters[k][0] or filters[k][1]

但它不是动态的。

如果有人有任何意见,我们将不胜感激!非常感谢。

filters上使用Object.entries()来获得[key, values]对的数组。使用Array.every()迭代这些对,并检查每个对是否包含当前对象的值。

const fn = (arr, filters) => {
const filtersArr = Object.entries(filters)

return arr.filter(o => 
filtersArr.every(([key, values]) => 
values.includes(o[key])
)
)
}
const users = [{"name":"Mark","location":"US","job":"engineer"},{"name":"Mark","location":"US","job":"clerk"},{"name":"Angela","location":"Europe","job":"pilot"},{"name":"Matthew","location":"US","job":"engineer"}]
const filters = {
name: ["Mark", "Matthew"],
location: ["US"],
job: ["engineer"]
}
const result = fn(users, filters)
console.log(result)

使用Array.includes()的一个警告是,情况的差异将提供false答案(在这种情况下,工程师工程(。要解决此问题,请使用不区分大小写的搜索标志(i(将当前单词转换为RegExp,并使用Array.some()检查它是否适合数组中的任何单词。

const fn = (arr, filters) => {
const filtersArr = Object.entries(filters)

return arr.filter(o => 
filtersArr.every(([key, values]) => {
const pattern = new RegExp(`^${o[key]}$`, 'i')

return values.some(v => pattern.test(v))
})    
)
}
const users = [{"name":"Mark","location":"US","job":"engineer"},{"name":"Mark","location":"US","job":"clerk"},{"name":"Angela","location":"Europe","job":"pilot"},{"name":"Matthew","location":"US","job":"engineer"}]
const filters = {
name: ["Mark", "Matthew"],
location: ["US"],
job: ["Engineer"]
}
const result = fn(users, filters)
console.log(result)

您可以循环遍历filter对象的条目,并确保每个键的值都是允许的值之一。

let users = [{name:"Mark",location:"US",job:"Engineer"},{name:"Mark",location:"US",job:"clerk"},{name:"Angela",location:"Europe",job:"pilot"},{name:"Matthew",location:"US",job:"Engineer"}];
const filters = {
name: ["Mark", "Matthew"],
location: ["US"],
job: ["Engineer"]
};
const res = users.filter(o => 
Object.entries(filters).every(([k,v])=>v.includes(o[k])));
console.log(res);

最新更新