2017-09-08 3 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

を使用して、その後、フィルタを連鎖された(https://eslint.org/docs/rules/no-param-reassign)[あなたは本当に奇妙な何もしていません]。 '.eslintrc'ファイルでルールをオフにするだけではどうですか? – Andy

+0

@Andy私たちはeslintにすばやく進む必要があるので、( –

+0

私はそれを得ます。私はESLintを取り除くことについて話しているのではなく、単に 'no-param-reassign'のルールをオフにします。 ESLintはあなたが作っただけのものです。 – Andy

答えて

2

今、それは程度の理由で、かなりハードになる可能性.mapコール、内部の変異に依存しているので、私は、コードを再構築することをお勧め。私の提案したコードが実際に動作するかどうかチェックすることはできませんが、もっと明確にしようとしていることの意図を表していると思います。

編集。説明:要するに、いくつかのものだけが関連するユーザーのリストがあります。それは、おそらくコードがusers.filterで始まることを望んでいると言えます。一般的な考え方は、選択したサービスの管理者権限を持つユーザーを除外することです。だから私はそのロジックを1つの関数(userHasAdminRightsForService)に抽出しようとしましたが、これはユーザーをフィルタリングするために使用する関数を返す関数として実装しました。この設計のために、users.filter(user => userHasAdminRightsForService(user, selectedService))ではなく、普通の英語のように読むコードが得られます。users.filter(userHasAdminRightsForService(selectedService))

Array.prototype.someは、配列にいくつかの基準を満たす要素が少なくとも1つあるかどうかを確認するために使用されます。したがって、userService.rights.some(right => lowCase(right.name) === 'admin')のような行は、userService.rightsの権利の少なくとも1つが「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

多分ルールを無効にすることなく書き直すことができますか?

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つの機能を削除しました)! 欠落部分が.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> 
    )); 
+1

あなたは何かを発見してニース!しかし、これは私が提案したコードとまったく同じですが、名前付き関数として抽出するのではなく、フィルタlambdaを使っています。 (そして '.some'の代わりに' .find'を使って)。私の答えの情報があなたの問題を解決したと言うのは公正でしょうか?あるいは類似点は単なる偶然の一致ですか? (それは起こり得ないと言っているわけではない)。 – jonahe

+1

チェック! :Dそしてありがとう... –

関連する問題