2017-09-08 1 views
2

특정 서비스가있는 사용자 만 찾으려고합니다. 각 사용자는 서비스 배열을 가지고 있습니다. 작품 아래내 필터에이 ESlint (no-param-reassign) 오류를 수정하는 방법

userService.name === service.name && !user.disabled

코드,하지만 PARAM - 재 할당을 처리 ESlint 오류가 있습니다 : 내가 찾아야 경기는 다음과 같습니다.

enter image description here


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

이는 .find로 리팩토링 할 수 있습니까?

+0

.find는 [당신은 정말 이상한 아무것도하지 않는]를 사용하여 필터를 체인되었다 (https://eslint.org/docs/rules/no-param-reassign). '.eslintrc' 파일에서 규칙을 끄지 않는 것이 좋을까요? – Andy

+0

@Andy 왜냐하면 우리는 eslint를 앞설 수밖에 없기 때문입니다. ( –

+0

나는 그것을 얻습니다. 나는 ESLint를 제거하는 것에 대해서가 아니라'no-param-reassign'에 대한 규칙을 막는 것에 대해 말하고 있습니다. 예를 들어, if ESLint는 사용자가 작성한 것만 큼 유익하지 않습니다. – Andy

답변

2

나는 코드를 구조 조정 건의 할 것입니다. 내 제안 된 코드가 실제로 작동하는지 검사 할 수는 없지만 더 명확하게하려는 의도를 표현한다고 생각합니다.

을 편집하십시오. 설명 : 간단히 말해, 일부 사용자 만 관련성이있는 사용자 목록이 있습니다. 그러면 코드가 users.filter으로 시작되기를 원할 것입니다. 일반적인 개념은 선택된 서비스에 대한 관리자 권한을 가진 사용자를 필터링하는 것입니다. 그래서 그 논리를 하나의 함수()로 추출하려고 시도했습니다.이 함수는 사용자를 필터링하는 데 사용할 함수를 반환합니다. 이 디자인 때문에 우리는 보통 영어와 비슷한 코드를 얻습니다 : users.filter(user => userHasAdminRightsForService(user, selectedService)) 대신 users.filter(userHasAdminRightsForService(selectedService)).

Array.prototype.some은 배열에 몇 가지 기준을 충족하는 요소가 하나 이상 있는지 확인하는 데 사용됩니다. 따라서 userService.rights.some(right => lowCase(right.name) === 'admin')과 같은 행은 userService.rights에있는 권리 중 하나 이상이 'admin'이라는 이름을 가져야한다는 기준을 충족하는지 확인합니다.

// 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

코드가 유효하지만 as the rule points out, 함수 매개 변수를 수정하거나 다시 지정하면 의도하지 않은 동작이 발생할 수 있습니다.

일반적으로 .eslintrc 파일에서 규칙을 완전히 비활성화하고 싶지 않지만 특정 오류 발생을 억제하려는 경우 rule-disabling comments 중 하나를 사용하십시오. 또한 사용자가 수행중인 작업을 알 수 있음을 나타냅니다.

1

어쩌면 규칙을 사용 중지하지 않고 다시 작성할 수 있습니까? 지금은 대한 이유에 꽤 어려워 질 수있는 .map 전화의 내부 돌연변이에 의존하기 때문에

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

고마워,하지만 기능적 스타일로 코드를 단순화하려고했는데,이게 훨씬 더 어려워 보인다. –

+0

아, 죄송합니다. 기능적 스타일로 다시 쓰고 싶다는 언급은 없었습니다. 그건 내가 생각하는 규칙을 설명한다. 그러면 다른 대답은 당신이 찾고있는 것입니다. –

0

우리는 이런 식으로 해결 결국, 훨씬 깨끗하고 방법을 적은 코드가 너무 (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> 
    )); 
+1

좋은 것을 찾았습니다. 이제는 그 사람이 아니야.하지만 이건 내가 제안한 코드와 거의 똑같은 것 같지만, 명명 된 함수로 추출되는 대신 필터 람다를 사용했다. (그리고'.some' 대신'.find'를 사용합니다.) 제 대답의 정보가 여러분의 문제를 해결했다고 말할 수 있습니까? 또는 유사점은 단순한 우연의 일치입니까? (그런 일은 일어날 수 없다는 말은 아닙니다.) – jonahe

+1

Checked! : D 그리고 고마워 ... –

관련 문제