◆ switch の各分岐をメソッドにしたオブジェクトに 分岐条件でメソッド取得して実行

try-catch を式で使えるようにしたついでに case もやってみました

普通に書くと

const value = "case1"
let result

switch(value){
case "case1": {
result = 1
} break
case "case2": {
result = 2
} break
default: {
result = 0
} break
}

こういう let をかきたくないのです
そこで単純に 分岐するケースの各値をメソッドにしました

const value = "case1"

const cases = {
case1(){
return 1
},
case2(){
return 2
},
_default_(){
return 0
},
}

const result = value in cases
? cases[value]()
: cases["_default_"]()

switch 文のときでも case にスコープをつけるため {} をつけるので対して変わってません
デフォルト分岐のために呼び出しがちょっと面倒になってるのがいまいちですがそれ以外はけっこういい感じかもしれません



使う側が楽なように関数にしようと思います
どうせなので case のところに関数を設定して true になったものを実行できるようにもしてみました

function expSwitch(cases, value, default_key = "default"){
return cases instanceof Map
? cases.get([...cases.keys()].find(key => (typeof key === "function" ? key(value) : key === value)) || default_key)(value)
: value in cases
? cases[value](value)
: cases[default_key](value)
}

使ってみます
expSwitch({
test1(){return 1},
test2(){return 2},
default(){return 0}
}, "test3")
// 0

expSwitch(new Map([
["test", v => 1],
[v => v.length > 4, v => 2],
["default", v => 0],
]), "test2")
// 2

Map のほうは見た目あんまりキレイくないですね