簡體   English   中英

如果 if/else if 中的任何條件為真,則執行代碼塊的巧妙方法

[英]clever way to execute code block if any condition in if/else if was true

我經常有 if/else if 塊部分包含相同的代碼。 我只想編寫一次此代碼,類似於“not else”(如果不滿足先驗條件,則執行 else 塊,如果滿足任何先驗條件,則執行 not else 塊)。 我知道您可以在每個塊中設置一個標志並測試之后是否設置了標志,或者創建一個在每個塊中調用的函數(如果您不需要編輯局部變量)。 您有更聰明/更優雅的解決方案的想法嗎? 在校對問題時,我想出了在 else 塊中返回並在其后放置您的通用代碼的想法 - 僅在您之前不必返回時才有效。

if (condition1) {
    /* unique code1 */
    /* common code */        

} else if (condition2) {
    /* unique code2 */
    /* common code */ 

} else if (condition3) {
    /* unique code3 */
    /* common code */ 

} else if (condition4) {
    /* unique code4 */
    /* common code */ 

}

一個非常規的解決方案是迭代一次的循環,從而為您提供break選項:

do {
    if (condition1) {
        // ...
    } else if (condition2) {
        // ...
    } else if (condition3) {
        // ...
    } else break;
    // common code
} while (false);

但是為了可讀性,我會選擇您在問題中已經提到的標志選項。

您可以將條件及其各自的代碼存儲在列表中,如下所示:

const conditions = [
  [condition1, () => {/* unique code1 */}],
  [condition2, () => {/* unique code2 */}],
  [condition3, () => {/* unique code3 */}],
  [condition4, () => {/* unique code4 */}],
];

const hasTruthy = conditions.some(([condition, fn]) => {
  if (condition) {
    fn();
    return true;
  }
});

if (hasTruthy) {
  /* common code */
}

但這可能只有在所有條件都很便宜的情況下才是可取的。 如果它們是性能飢渴的,即使只有一些實際上需要檢查,它們也會被執行。 如果條件確實很昂貴,您可以使用函數調用而不是實際條件並在some循環中調用它們。

100 次中有 99 次,我會采用 caw 在他現已刪除的答案中所建議的。

但是如果你有一組非常長的條件(比如超過 10 個),你可以考慮使用映射(關聯數組)來查找條件的代碼路徑

let action_table = [];
action_table["condition1"] = ()=>{/* unique code 1 */};
action_table["condition2"] = ()=>{/* unique code 2 */};
action_table["condition3"] = ()=>{/* unique code 3 */};
action_table["condition4"] = ()=>{/* unique code 4 */};

let condition = /*compute condition based on variables and state*/;
action_table[condition](); /* execute unique code action */
unique_code();

/* common code */

當每個條件的唯一代碼路徑正在做一些微不足道的事情(例如轉換值、設置解析狀態、處理標記等)並且公共代碼是函數目的的核心所在時,這可能很有用。 通常上面是當原始實現開始有太多 if/else 條件時切換到的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM