我有一个用户数组和一个过滤器数组。
我需要根据过滤器数组过滤用户,但是当我这样做时,它将过滤一个数组,而不过滤其他数组
我的过滤器对象如下所示:
filters: {
levels: [],
locations: ['Laois'],
subjects: ['Art']
}
我的用户如下所示:
const users = [
{
email: '[email protected]',
levels: ['Ordinary'],
location: 'Laois',
subjects: ['Art', 'German']
},
{
email: '[email protected]',
levels: ['Higher', 'Ordinary'],
location: 'Laois',
subjects: ['English', 'German']
}
]
根据上面的过滤器,过滤后的用户只能是一个,因为其中包含“ Art”和“ Laois”:
[{
email: '[email protected]',
levels: ['Ordinary'],
location: 'Laois',
subjects: ['Art', 'German']
},
]
但是我仍然得到两个用户:
编辑我的代码:
applyFilter = (visable) => {
let { filters, users } = this.state;
const { subjects, locations, levels } = filters;
let filteredUsers = [];
const filteredData = users.filter((user) =>
user.subjects.some(subject => subjects.includes(subject)) ||
locations.some(location => location === user.location) ||
user.levels.some(level => levels.includes(level))
);
console.log(filteredData)
if (!subjects.length && !locations.length && !levels.length) {
filteredUsers = users;
} else {
filteredUsers = filteredData;
}
this.setState({
filterModalVisible: visable,
filteredResults: filteredUsers.length >= 0 ? filteredUsers : [],
});
}
您可以使用filter
和every
方法通过使用相同的键检查用户值中是否存在过滤器值中的每个元素来实现此目的。
const filters = {"levels":[],"locations":["Laois"],"subjects":["Art"]}
const users = [{"email":"[email protected]","levels":["Ordinary"],"locations":"Laois","subjects":["Art","German"]},{"email":"[email protected]","levels":["Higher","Ordinary"],"locations":"Laois","subjects":["English","German"]}]
const res = users.filter(user => {
return Object.entries(filters)
.every(([key, value]) => {
if (Array.isArray(value)) {
return value.every(filter => {
return user[key] && user[key].includes(filter)
})
} else {
return user[key] == value
}
})
})
console.log(res)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句