Ramda 要實現 Ternary Operator 要使用 ifElse
,實務上還常得搭配 identity
與 always
,Sanctuary 則提供了 boolean
,只需單一 Function 即可達成需求。
Version
Sanctuary 3.1.0
?:
import { pipe, pluck, map } from 'ramda'
let data = [
{ title: 'FP in JavaScript', inStock: true },
{ title: 'Elm in Action', inStock: false },
{ title: 'Speaking JavaScript', inStock: false }
]
let f = pipe (
pluck ('inStock'),
map (x => x ? 'Avaliable' : 'Sold Out')
)
f (data) // ?
若 inStock
為 true
則顯示 Avaliable
,false
則顯示 Sold Out
,我們會在 map
的 callback 內使用 ?:
ternary operator。
ifElse
import { pipe, pluck, map, ifElse, identity as I, always as K } from 'ramda'
let data = [
{ title: 'FP in JavaScript', inStock: true },
{ title: 'Elm in Action', inStock: false },
{ title: 'Speaking JavaScript', inStock: false }
]
let f = pipe (
pluck ('inStock'),
map (ifElse (I) (K ('Avaliable')) (K ('Sold Out')))
)
f (data) // ?
若想將 map
的 callback 也 Point-free,Ramda 需使用 ifElse
實現 ?:
,但因為 3 個 argument 都是 function,因此還必須搭配 I
與 K
。
boolean
import { pipe, map, prop, boolean } from 'sanctuary'
let data = [
{ title: 'FP in JavaScript', inStock: true },
{ title: 'Elm in Action', inStock: false },
{ title: 'Speaking JavaScript', inStock: false }
]
let f = pipe ([
map ( prop ('inStock')),
map ( boolean ('Sold Out') ('Avaliable'))
])
f (data) // ?
Sanctury 雖然也提供 ifElse
,其 signature 與 Ramda 完全相同,但 boolean
更為好用,只需直接提供 false
與 true
所回傳 value 即可,可讀性更高也更精簡。
boolean
a -> a -> Boolean -> a
?:
ternary operator 的 function 版本
a
:當 false
的回傳值
a
:當 true
的回傳值
Boolean
:data 為 Boolean
a
:最後回傳值
Conclusion
?:
ternary operator 經常會使用到,而 Sanctuary 的boolean
遠比 Ramda 的ifElse
精簡,實務上推薦使用