如何在我的过滤器中修复此ESlint(无参数重新分配)错误

时间:2017-09-08 16:31:20

标签: javascript reactjs eslint higher-order-functions

我试图仅查找具有特定服务的用户。每个用户都有一系列服务。我需要找到的匹配如下:

export const matchUserWithService = (user, userService, service) => { if (userService.name === service.name && !user.disabled) { user.isMatched = true; userService.rights = service.rights; } return userService; }; export const renderServiceAdmins = (users, selectedService) => { const usersWithService = users.filter((user) => { user.services.map(usrSrv => matchUserWithService(user, usrSrv, selectedService)); if (user.isMatched) return user; return false; }); return usersWithService.map(user => user.services.map(service => service.rights.map((right) => { if ( service.name === selectedService.name && lowCase(right.name) === 'admin' && !right.disabled ) { return ( <li key={user.email + randId()}> { user.name } | <span className="info_blue">{ user.email }</span> </li> ); } return null; }))); };

下面的代码有效,但处理param-reassignment的ESlint错误。

ob_type attribute is the class (or type) of the object

.find

可以使用{{1}}进行重构吗?

4 个答案:

答案 0 :(得分:2)

我建议重组代码,因为现在它依赖于.map调用内部的突变,这可能变得非常难以推理。我无法检查我建议的代码是否真的有效,但我认为它表达了你想要做的更清楚的意图。

修改即可。说明:简而言之,我们有一个用户列表,其中只有一些是相关的。这告诉我们,我们可能希望代码以users.filter开头。一般的想法是过滤掉具有所选服务的管理员权限的用户。所以我尝试将该逻辑提取到一个函数(userHasAdminRightsForService)中,我将其作为一个函数实现,该函数返回我们想要用来过滤用户的函数。由于这种设计,我们得到的代码更像普通英语:users.filter(userHasAdminRightsForService(selectedService))而不是users.filter(user => userHasAdminRightsForService(user, selectedService))

Array.prototype.some用于检查数组是否至少有一个符合某些条件的元素。因此,像userService.rights.some(right => lowCase(right.name) === 'admin')这样的行意味着我们会检查userService.rights中的至少一项权利是否满足应该具有名称的标准&#39; admin&#39;。

// given a serviceToCheckFor, return a function that checks if 
// one specific user has any userService, with admin rights, that match the name of serviceToCheckFor
export const userHasAdminRightsForService = serviceToCheckFor = user => {
  return user.services.some(userService => 
    // name check
    userService.name === serviceToCheckFor.name &&
    // check if there exists a non-disabled admin right 
    userService.rights
      .filter(right => !right.disabled)
      .some(right => lowCase(right.name) === 'admin')
    );
}; 

export const renderServiceAdmins = (users, selectedService) => {
    const adminsForSelectedService = users
      .filter(user => !user.disabled)
      .filter(userHasAdminRightsForService(selectedService))

  return adminsForSelectedService.map( admin => 
     (<li key={admin.email + randId()}>
        { admin.name } | <span className="info_blue">{ admin.email }</span>
     </li>)
  );
};

答案 1 :(得分:1)

您的代码有效,但as the rule points out,修改或重新分配功能参数可能会导致意外行为。

一般情况下,如果您不想在.eslintrc文件中完全禁用规则,但只希望使用rule-disabling comments中的一个来抑制特定匹配错误,则它也会在某种程度上表示您知道你在做什么。

答案 2 :(得分:1)

也许你可以在不禁用规则的情况下重写?

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

答案 3 :(得分:0)

我们最终以这种方式解决它,更清洁,更少的代码(删除2个功能)! 缺少部分是使用.find

链接过滤器
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>
    ));