2017-10-18 8 views
0

次のコードは、フォームのフィールドをループするループ内にあります。 isV1Usertrueの場合、フィールドは無効になります。ユーザーにcustomSettingがある場合は、フィールドを無効にしないでください。ユーザーが持っていない場合は、無効にします。次のif文と3項演算子を簡略化するには?

if (field.name === 'themeColor') { 
    if (this.isV1User) { 
    field.disabled = false 
    } else { 
    field.disabled = this.user.customSetting 
     ? !this.user.customSetting.themePicker 
     : false 
    } 
} 

このコードのネストを単純化するか、少なくとも削除するにはどうすればよいですか?

+0

の場合は避ける必要があります。 – CBroe

+0

_ "isV1Userがtrueの場合、フィールドは無効になります。ユーザーがcustomSettingを持っている場合は、フィールドを無効にしないでください。ユーザーがそれを持っていない場合は、それを無効にしてください。 "_ - そう、単純に言えば、ユーザーがV1である場合は無効にするか、ユーザーがカスタム設定を持っていないか... ...? – CBroe

+0

https://codereview.stackexchange.com/ –

答えて

3

移動三に、すべてのif条件:

if (field.name === 'themeColor') { 
    field.disabled = !this.isV1User && this.user.customSetting && !this.user.customSetting.themePicker; 
} 
1
if (field.name === 'themeColor') { 
    field.disabled = this.user.customSetting && !this.isV1User ? 
    !this.user.customSetting.themePicker : false; 
} 
1

これは本当にスタックオーバーフローの問題ではない、私は推測するコードレビューに良く合うでしょう。

trueにする必要がある状況は1つだけありますが、これは多分このように思われますか?

if (field.name === 'themeColor') { 
    field.disabled = (
     !this.isV1User && 
     this.user.customSetting && !this.user.customSetting.themePicker); 
} 

他のフィールドは変更されないまま必要がありますので、最初のifはまだ(私は仮定)が必要です。

0

は、それは、次の同等のコードを最小限に抑えることができ、この

if (field.name === 'themeColor') { 
    field.disabled = this.isV1User ? true : this.user.customSetting ? !this.user.customSetting.themePicker : false; 
} 
+0

に質問を投稿する必要がありますか?コードが正常に機能していますか?三項演算子は右から左へ、* pro-tip *のように '()'のない複数の三項演算子は**非常に混乱して読みにくいです。 – Justinas

1

あなたはあなたのコードを構造化しているこの

"themeColor"===field.name && (field.disabled=this.isV1User?!1: 
this.user.customSetting?!this.user.customSetting.themePicker:!1); 
+0

フィールド名が 'themeColor'でない場合でも、フィールド' disabled'属性は変更されます。 – Justinas

1

方法のように行うことができます試してみてください。

if (field.name == 'themeColor' && this.user.customSetting) { 
field.disabled = !this.user.customSetting.themePicker; 
} else if (field.name == 'themeColor') { 
field.disabled = false; 
} 

たり、次のswitch文、あなたが望む方法に応じ:this.user.customSetting.themePickerは常に真であることが保証されている場合this.user.customSettingがtrueの場合、あなたは条件付きでfield.name == 'themeColor'である場合、単一の文でfield.disabled = trueを設定できることに注意してくださいあなたのコード構造。どちらも同じです。

switch (field.name) { 
    case 'themeColor': 
    if (this.user.customSetting) { 
     field.disabled = !this.user.customSetting.themePicker; 
    } 
    break; 
    default: 
    field.disabled = false; 
} 

これらの回答のほとんどは、三項文の読みやすさの基本ルールを破ります。あなたの目標が単純化された読みやすさであれば、それを単純な0​​ステートメントに分解します。できるだけコードを最小限に抑えようとしていて、読み込みが困難な場合は気にしないでください。再帰的な三項文に単純化してください。個人的には、長い三元声明では、大幅な省スペース、読みやすさの妨げとなることはなく、極端に単純ではない場合(つまり:var x = statement? 1 : 0;)、