Javascript 如何修复我的筛选器中的此ESlint(无参数重新分配)错误
我试图只找到拥有特定服务的用户。每个用户都有一系列服务。我需要找到的匹配项如下:Javascript 如何修复我的筛选器中的此ESlint(无参数重新分配)错误,javascript,reactjs,eslint,higher-order-functions,Javascript,Reactjs,Eslint,Higher Order Functions,我试图只找到拥有特定服务的用户。每个用户都有一系列服务。我需要找到的匹配项如下: userService.name===service.name&&!用户。已禁用 下面的代码可以工作,但在处理参数重新分配时有ESlint错误 export const matchUserWithService=(用户、用户服务、服务)=>{ if(userService.name===service.name&&!user.disabled){ user.isMatched=true; userService
userService.name===service.name&&!用户。已禁用
下面的代码可以工作,但在处理参数重新分配时有ESlint错误
export const matchUserWithService=(用户、用户服务、服务)=>{
if(userService.name===service.name&&!user.disabled){
user.isMatched=true;
userService.rights=service.rights;
}
返回用户服务;
};
导出常量renderServiceAdmins=(用户,selectedService)=>{
const usersWithService=users.filter((用户)=>{
user.services.map(usrSrv=>matchUserWithService(user,usrSrv,selectedService));
如果(user.isMatched)返回用户;
返回false;
});
返回usersWithService.map(用户=>user.services.map(服务=>service.rights.map((右)=>{
如果(
service.name==selectedService.name&&
lowCase(right.name)==“admin”&&
!对,禁用
) {
返回(
{user.name}{user.email}
);
}
返回null;
})));
};
是否可以使用.find
重构此功能?您的代码是有效的,但是,修改或重新分配函数参数可能会导致意外行为
通常,如果您不想完全禁用
.eslintrc
文件中的某个规则,而只想禁止特定的eslint错误发生,请使用其中一个,这在某种程度上也表明您知道自己在做什么。也许您可以在不禁用规则的情况下重写规则
export const renderServiceAdmins = (users, selectedService) => {
var admins = users.reduce((serviceAdmins, user) => {
user.services
.forEach((service) =>{
if(service.name === selectedService.name) {
service.rights
.forEach((right)=> {
if( lowCase(right.name) === 'admin' && !right.disabled) {
serviceAdmins.concat[{
name: user.name,
name: user.email
}]
}
})
}
});
return serviceAdmins;
}, []);
return admins.map(admin=> {
return (
<li key={admin.email + randId()}>
{ admin.name } | <span className="info_blue">{ admin.email }</span>
</li>
);
});
};
export const renderservices admin=(用户,selectedService)=>{
var admins=users.reduce((serviceAdmins,user)=>{
用户服务
.forEach((服务)=>{
if(service.name==selectedService.name){
服务权
.forEach((右)=>{
if(lowCase(right.name)==“admin”&&!right.disabled){
serviceAdmins.concat[{
name:user.name,
名称:user.email
}]
}
})
}
});
返回服务管理员;
}, []);
返回admins.map(admin=>{
返回(
{admin.name}{admin.email}
);
});
};
我建议重新构造代码,因为现在它依赖于.map
调用内部的突变,这可能很难解释。我无法检查我建议的代码是否真的有效,但我认为它更清楚地表达了您试图做的事情的意图
编辑。说明:简而言之,我们有一个用户列表,其中只有一些是相关的。这告诉我们,我们可能希望代码以users.filter
开头。总体思路是筛选出对所选服务具有管理员权限的用户。因此,我尝试将该逻辑提取到一个函数(userHasAdminRightsForService
)中,我将其实现为一个函数,该函数返回我们要用于过滤用户的函数。由于这种设计,我们得到的代码读起来更像普通英语:users.filter(userHasAdminRightsForService(selectedService))
而不是users.filter(user=>userHasAdminRightsForService(user,selectedService))
用于检查数组中是否至少有一个元素符合某些条件。因此,像userService.rights.some(right=>lowCase(right.name)==“admin”)这样的行意味着我们检查userService.rights
中的至少一个权限是否满足名称为“admin”的条件
//给定一个serviceToCheckFor,返回一个函数来检查
//一个特定用户拥有与serviceToCheckFor名称匹配的任何具有管理员权限的userService
export const userHasAdminRightsForService=serviceToCheckFor=user=>{
返回user.services.some(userService=>
//姓名检查
userService.name==serviceToCheckFor.name&&
//检查是否存在未禁用的管理员权限
userService.rights
.filter(右=>!右.禁用)
.some(right=>lowCase(right.name)==“admin”)
);
};
导出常量renderServiceAdmins=(用户,selectedService)=>{
const adminsForSelectedService=用户
.filter(用户=>!用户已禁用)
.filter(userHasAdminRightsForService(selectedService))
返回adminsForSelectedService.map(admin=>
(
{admin.name}{admin.email}
)
);
};
我们最终以这种方式解决了这个问题,更干净,代码更少(删除了2个函数)!
缺少的部分是链接过滤器,然后使用。查找
export const renderServiceAdmins = (users, theService) =>
users
.filter(user => !user.disabled)
.filter(user => user.services.find(
usrSrv => (
usrSrv.name === theService.name &&
usrSrv.rights.find(r => r.name.toLowerCase() === 'admin' && !r.disabled)
)
))
.map(user => (
<li key={user.email + randId()}>
{ user.name } | <span className="info_blue">{ user.email }</span>
</li>
));
export const renderservices admin=(用户,服务)=>
使用者
.filter(用户=>!用户已禁用)
.filter(用户=>user.services.find(
usrSrv=>(
usrSrv.name==theService.name&&
usrSrv.rights.find(r=>r.name.toLowerCase()==='admin'&&!r.disabled)
)
))
.map(用户=>(
{user.name}{user.email}
));
。为什么不在你的.eslintrc
文件中关闭规则?@Andy,因为我们被要求提前到eslint:(我明白了。我不是说要删除eslint,而是关闭无参数重新分配的规则。
。例如,如果我有这个错误,我会打开它
export const renderServiceAdmins = (users, theService) =>
users
.filter(user => !user.disabled)
.filter(user => user.services.find(
usrSrv => (
usrSrv.name === theService.name &&
usrSrv.rights.find(r => r.name.toLowerCase() === 'admin' && !r.disabled)
)
))
.map(user => (
<li key={user.email + randId()}>
{ user.name } | <span className="info_blue">{ user.email }</span>
</li>
));