2017-10-18 78 views
0

以下代碼位於循環遍歷表單字段的循環中。如果isV1Usertrue,則該字段被禁用。如果用戶有customSetting則不要禁用該字段。如果用戶沒有它,請禁用它。如何簡化以下if語句和三元運算符?

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

如何簡化或至少刪除此代碼的嵌套?

+0

爲什麼? (他想簡單地問,但是StackOverflow需要更多的字符) – 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,看起來,所以也許這樣?

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

您已經構建你的代碼的方式,可以最小化到下面的等效代碼。請注意,如果this.user.customSetting.themePicker是保證始終是真實的,當this.user.customSetting是真實的,你可以在一個單一的if語句,其中條件是field.name == 'themeColor'設置field.disabled = true

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

甚至以下switch語句,這取決於你如何想你的代碼結構化。他們都是一樣的。

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

這些答案大多打破了三元語句可讀性的基本規則。如果你的目標是簡單的可讀性,將其分解成簡單的if/else if聲明就可以了。如果您試圖儘可能減少代碼,並且不在乎它是不可維護還是難以閱讀,則應該將其簡化爲遞歸三元語句。就我個人而言,我發現冗長的三元陳述並不能提供顯着的節省空間,阻礙可讀性,並且在它們不是非常簡單的情況下應避免(即:var x = statement? 1 : 0;