switch-case 式にする
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ switch の各分岐をメソッドにしたオブジェクトに 分岐条件でメソッド取得して実行
try-catch を式で使えるようにしたついでに case もやってみました
普通に書くと
こういう let をかきたくないのです
そこで単純に 分岐するケースの各値をメソッドにしました
switch 文のときでも case にスコープをつけるため {} をつけるので対して変わってません
デフォルト分岐のために呼び出しがちょっと面倒になってるのがいまいちですがそれ以外はけっこういい感じかもしれません
使う側が楽なように関数にしようと思います
どうせなので case のところに関数を設定して true になったものを実行できるようにもしてみました
使ってみます
Map のほうは見た目あんまりキレイくないですね
普通に書くと
const value = "case1"
let result
switch(value){
case "case1": {
result = 1
} break
case "case2": {
result = 2
} break
default: {
result = 0
} break
}
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_"]()
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)
}
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
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 のほうは見た目あんまりキレイくないですね