我有一个数组
[
{
email: "test@gmail.com"
loginLink: "http://localhost:3000/signup?q=f1aea1ff-c833-4e7b-8608-a1f51a9da104"
name: "Pulkit (Creator)"
roles: {hr: false, manager: true, admin: true}
}, {and similar more values}
现在我已经按照下面的方式根据姓名和邮箱来整理值了
useEffect(() => {
setOnScreenUsers(
users.filter((user) => {
if (userFilterQ === "") {
return user;
} else if (
user.user.name.toLowerCase().includes(userFilterQ.toLowerCase()) ||
user.user.email.toLowerCase().includes(userFilterQ.toLowerCase())
) {
return user;
} else {
return "";
}
})
);
}, [userFilterQ, users]);
这东西运行正常。现在假设用户只想获取那些具有 hr 或 manager 角色的数组(一次一个)。如何实现这一点
PS:我将过滤后的数组存储在另一个数组中以进行渲染
如果您需要任何额外信息,请告诉我
答案 0 :(得分:0)
我认为您对 Array.prototype.filter 方法的工作方式有误解。在回调函数中,您应该返回一个布尔值(false,从过滤后的数组中删除项目)
您要做的只是在回调函数中添加另一个条件。
useEffect(() => {
setOnScreenUsers(
users.filter((user) => {
if (serFilterQ === "") {
return true;
}
const lowercaseFilterQ = userFilterQ.toLowerCase();
if (
user.user.name.toLowerCase().includes(lowercaseFilterQ) ||
user.user.email.toLowerCase().includes(lowercaseFilterQ) ||
// Change the line below to whatever type of role you'd like
user.user.roles.hr
) {
return true;
}
return false;
})
);
}, [userFilterQ, users]);
答案 1 :(得分:0)
如果对 let x = {}
const a = new Set([3, 5])
x[a] = 1
console.log(x) // >{[object Set]: 1}
const b = new Set([1, 4])
x[b] = 2
console.log(x) // >{[object Set]: 2}
属性应用过滤器,那么您只需将其添加为附加条件测试即可。
您也可以稍微简化一下逻辑。如果过滤器值是假的,只需返回 from collections import defaultdict
a = [1,2,4,5,8]
b = [8,5,4,1,2]
d = defaultdict(list) #(element,index) map
for i,v in enumerate(a):
d[v]=[i]
for j,x in enumerate(b):
d[x].append(j)
print(d)
以便所有元素都被过滤到结果数组。如果任何过滤器查询值是真值,则返回布尔表达式。
role
让我们知道如果您通过多个值过滤 true
,逻辑需要稍作调整。