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>
        ));