2017-11-25 21 views
2

我真的很新使用條件(三元)運算符。是否可以在這個操作符中放置一個switch語句?是否可以將一個switch語句放入一個有條件(三元)的內部?

這是我的嘗試:

function find(cn, romanNum) { 
     if (cn >= 1 && cn <= 3) { 
      return repeatString(romanNum[2], cn); 
     } 
     cn > 5 && cn < 9 ? return romanNum[1] + repeatString(romanNum[2], cn - 5) : switch(cn) { 
      case 4: 
      return romanNum[2] + romanNum[1]; 
      case 5: 
      return romanNum[1]; 
      case 9: 
      return romanNum[2] + romanNum[0]; 
    } 
} 

我做錯了,我知道,但它是什麼?每個人在某個時間點都是新手。


錯誤:

  • 預計一個標識符,而是看到了'return'
  • 預計':'而代之以看到'romanNum'
  • 缺少分號。
  • 預計'}'以匹配線58 '{',而是看到':'

這是正確的ES5代碼:

function find(cn, romanNum) { 
     if (cn >= 1 && cn <= 3) { 
      return repeatString(romanNum[2], cn); 
     } else if (cn == 4) { 
      return romanNum[2] + romanNum[1]; 
     } else if (cn == 5) { 
      return romanNum[1]; 
     } else if (cn == 9) { 
      return romanNum[2] + romanNum[0]; 
     } 
     if (cn > 5 && cn < 9) { 
      return romanNum[1] + repeatString(romanNum[2], cn - 5); 
     } 
    } 

幫助?

+0

不,這是不可能的。由於'?:'是一個運算符,它的操作數必須是表達式,但'switch'是一個語句 - 不是表達式。 (與'return'一樣。)你可能一直希望https://github.com/tc39/proposal-pattern-matching? – Ryan

+3

不要在這裏強制使用三元組。 Ternarys專門用於評估兩種價值之一。你在這裏使用是濫用。只要我們一個如果。 – Carcigenicate

+6

爲什麼你要編寫這種神祕的代碼呢? –

回答

1

你可以使用一個嵌套三元蒙山一個對象作爲更換爲select結構。

function find(cn, romanNum) { 
    return cn >= 1 && cn <= 3 
     ? repeatString(romanNum[2], cn) 
     : cn > 5 && cn < 9 
      ? romanNum[1] + repeatString(romanNum[2], cn - 5) 
      : { 
       4: romanNum[2] + romanNum[1], 
       5: romanNum[1], 
       9: romanNum[2] + romanNum[0] 
      }[cn]; 
} 

甲步驟進一步,可以省略第二三元和使用所述第一條件爲默認值的對象的不存在的屬性的結果。

function find(cn, romanNum) { 
    return cn >= 1 && cn <= 3 
     ? repeatString(romanNum[2], cn) 
     : { 
      4: romanNum[2] + romanNum[1], 
      5: romanNum[1], 
      9: romanNum[2] + romanNum[0] 
     }[cn] || romanNum[1] + repeatString(romanNum[2], cn - 5); 
} 
+0

你是最短的,謝謝。它也很容易理解。謝謝。也感謝所有其他人回答:) – Leed

3

tl; dr:有點,但你不應該這樣做,因爲它不可讀。
始終保持簡短的代碼簡短但冗長。

長答案: 你可以將你的交換機包裹在一個立即調用的匿名函數中。

const a = 20; 
 
const condition = a > 100; 
 
const result = condition ? true : (() => { 
 
    switch (a) { 
 
    case 11: return 22; 
 
    case 20: return 21; 
 
    default: return 100; 
 
    } 
 
})(); 
 

 
console.log(result);

但是這不僅是更復雜,但是也難以閱讀。

最好使用冗長的編碼風格。 在你的情況是這樣,這將是更清潔和更可讀:

function test(a) { 
 
    const condition = a > 100; 
 

 
    if (condition) { 
 
    return true; 
 
    } 
 
    
 
    switch (a) { 
 
    case 20: return 21; 
 
    default: return 100; 
 
    } 
 
} 
 

 
console.log(test(20));

+0

我會如何做真假?我希望它運行一行代碼(如果爲true),或者如果不是true則切換。 – Leed

+0

我更新了我的答案,並在末尾提供了一個更易讀的代碼示例 – lumio

2

您可以使用IIFE:

return condition 
    ? (() => { 
     switch (val) { 
     case x: return a; 
     case y: return b; 
     default: return c; 
     } 
    })() 
    : other; 

然而,這是可怕的不可讀和不低於甚至更短簡單的if聲明。


也就是說,有超過switch用於查找值的一個更好的選擇:一個查找表!只需使用一個對象,數組或Map並使用您的cn作爲屬性名稱。

const table = { 
    1: repeatString(romanNum[2], 1), 
    2: repeatString(romanNum[2], 2), 
    3: repeatString(romanNum[2], 3), 
    4: romanNum[2] + romanNum[1], 
    5: romanNum[1], 
    6: romanNum[1] + repeatString(romanNum[2], 1), 
    7: romanNum[1] + repeatString(romanNum[2], 2), 
    8: romanNum[1] + repeatString(romanNum[2], 3), 
    9: romanNum[2] + romanNum[0] 
}; 
function find(cn) { 
    return table[cn]; 
} 

// using an array similar to the object above: 
table = [ 
    ...Array.from({length: 4}, (_, i) => repeatString(romanNum[2], i)) 
    romanNum[2] + romanNum[1], 
    ...Array.from({length: 4}, (_, i) => romanNum[1] + repeatString(romanNum[2], i)), 
    romanNum[2] + romanNum[0] 
]; 
+0

因此,它將通過表並返回基於cn的值? – Leed

+0

它不會*通過*表格。它會直接進入表格中的正確位置。 – Bergi

+0

我試過了,它沒有返回正確的東西 - > https://repl.it/@John_Nicole/Intermediate-Algorithm-Scripting-Roman-Numeral-Converter(第58行,我把一些舊的es5代碼目前)。 – Leed

1
  1. ü不能使用這樣只是一個小例子返回來說明如何在正常的三元操作

    function find(cn, romanNum) { 
        if (cn >= 1 && cn <= 3) { 
        return 2; 
        } 
    
        return (cn > 5 && cn < 9) ? (romanNum[1] + 2, cn - 5) : 3 
    

    }

  2. 沒有它不可能使用開關恢復在三元操作符中的陳述,因爲開關不是條件或表達式的陳述

  3. 更好地使用,如果-else

  4. 如果你想,因爲它阻礙了堅持三元然後作出這樣

function find(cn, romanNum) { 
 
     if (cn >= 1 && cn <= 3) { 
 
      return repeatString(romanNum[2], cn); 
 
     } 
 
     return cn > 5 && cn < 9 ? romanNum[1] + repeatString(romanNum[2], cn - 5) : (cn===4 ? romanNum[2] + romanNum[1]: 
 
      (cn==5 ? romanNum[1] : romanNum[2] + romanNum[0])) 
 
} 
 

 
console.log(find(2,[1,2,3,4]))

的變化雖然我不會喜歡嵌套三元運算符代碼的可讀性。

+0

好吧謝謝,生病請記住這一點。 – Leed

相關問題