2012-01-06 55 views
0

你能幫我簡化這個IF結構嗎?這是JavaScript的像節點,但一些私有的,因此忽略了db.execute東西:)簡化IF結構

if(!("Division" in Shipping)) 
    { 
     var shipError = false; 
     Shipping.Division = Billing.Division; 
     if(!Shipping.Division) 
     { 
       if(Shipping.PostalCode) 
      { 
       Shipping.Division = Db.ExecuteScalar("SELECT Code from Location.Division D JOIN Location.PostalCode P ON DivisionId = D.ID AND PostalCode=?", Shipping.PostalCode); 
       if(!Shipping.Division) shipError = true; 
      } 
      else 
       shipError = true; 
     } 

     if(shipError){ 
       Errors.push({Code : "SHIPPINGDIVISION", Message : "Shipping State Required"}); 
       Shipping.Division = ""; 
     } 
    } 
+0

爲什麼要簡化它?它運行不正常,還是有任何模糊的bug,性能問題? – 2012-01-06 06:13:15

+0

有沒有更簡單的方法來做到這一點。 – Acn 2012-01-06 06:21:28

+0

@大我欣賞幽默。 – deceze 2012-01-06 06:23:13

回答

0

你試過使用谷歌關閉?

這是一個JavaScript優化器。如果你喜歡你可以在你的代碼中使用它的一些優化,那麼試試看看它是如何優化你的代碼的。

來自頁面。

JavaScript優化器 Closure編譯器將JavaScript編譯爲緊湊的高性能代碼。編譯器刪除死代碼並重寫並最小化剩下的部分,以便下載並快速運行。它還檢查語法,變量引用和類型,並警告常見的JavaScript陷阱。這些檢查和優化可幫助您編寫較少bug且易於維護的應用程序。你可以在編譯器中使用Closure Inspector,這是一個Firebug擴展,它可以調試混淆代碼,就像調試可讀源一樣簡單。

鏈接Google Closure

您的代碼進行了優化。

if(!("Division" in Shipping)) { 
    var shipError = !1; 
    Shipping.Division = Billing.Division; 
    if(!Shipping.Division) { 
    Shipping.PostalCode ? (Shipping.Division = Db.ExecuteScalar("SELECT Code from Location.Division D JOIN Location.PostalCode P ON DivisionId = D.ID AND PostalCode=?", Shipping.PostalCode), Shipping.Division || (shipError = !0)) : shipError = !0 
    } 
    if(shipError) { 
    Errors.push({Code:"SHIPPINGDIVISION", Message:"Shipping State Required"}),  Shipping.Division = "" 
    } 
} 
; 
+0

不要以爲自動優化的代碼就像它得到的那樣好。 @deceze和我給出的答案都很短,但都完全消除了'shipError'變量,並且兩者都更容易閱讀,因此更易於維護。問題是關於「簡化」,但是在開始「Shipping.PostalCode?」的Google Closure版本中間的那條線就是愚蠢的 - 是的,它做的是同樣的事情;不會使它成爲現實。 – nnnnnn 2012-01-09 06:25:29

3
if (!Shipping.Division) { 
    Shipping.Division = Billing.Division; 
} 
if (!Shipping.Division && Shipping.PostalCode) { 
    Shipping.Division = Db.ExecuteScalar(...); 
} 
if (!Shipping.Division) { 
    Errors.push({Code : "SHIPPINGDIVISION", Message : "Shipping State Required"}); 
} 

閱讀本爲:

  • 如果不是出貨師
    • 試圖把航運師來自計費部門
  • 如果不是裝運部門,但郵政編碼
    • 嘗試從郵政編碼得到航運部門
  • 如果仍不能出貨師
    • 失敗
+0

這很好,但您還需要嘗試將'Shipping.Division'設置爲'Billing.Division'。 – 2012-01-06 06:23:33

+0

'if(!Shipping.Division &&!(Shipping.Division = Billing.Division)&& Shipping.PostalCode){...}'會更準確地反映原始算法... – nnnnnn 2012-01-06 06:24:20

+0

@Tikhon我在這裏舉個例子,不寫產品代碼。 – deceze 2012-01-06 06:24:35

2

你不需要shipError變量,你可以測試if(!Shipping.Division)再次結束。這可以讓你消除變量聲明(很明顯),但也會刪除僅用於設置shipError = trueifelse。結束了這樣的:

if(!("Division" in Shipping)) { 
    Shipping.Division = Billing.Division; 
    if(!Shipping.Division) { 
     if(Shipping.PostalCode) { 
     Shipping.Division = Db.ExecuteScalar("SELECT statement here", 
               Shipping.PostalCode); 
     }  
    } 
    if(!Shipping.Division){ 
     Errors.push({Code : "SHIPPINGDIVISION", Message : "Shipping State Required"}); 
     Shipping.Division = ""; 
    } 
}