where()
可自行傳入 Function 比較更為靈活,但對於常用的 equals()
,則使用 whereEq()
更為精簡。
Version
Ramda 0.27.1
where()
import { pipe, filter, prop, equals, pluck, head, multiply as mul } from 'ramda'
let data = [
{ title: 'FP in JavaScript', price: 100 },
{ title: 'Programming Haskell', price: 200 },
{ title: 'Speaking JavaScript', price: 300 }
]
pipe(
filter(pipe(prop('title'), equals('Speaking JavaScript'))),
pluck('price'),
head,
mul(0.8)
)(data) // ?
想要取出 title 為 Speaking JavaScript
的 price 加以打八折,在 filtr()
內需做兩件事情:
- 使用
prop()
先取得title
內容 - 使用
equals()
判斷是否等於Speaking JavaScript
- 最後使用
pipe()
組合
這樣雖然可行,但可讀性較差。
whereEq()
import { pipe, filter, whereEq, pluck, multiply as mul, head } from 'ramda'
let data = [
{ title: 'FP in JavaScript', price: 100 },
{ title: 'Programming Haskell', price: 200 },
{ title: 'Speaking JavaScript', price: 300 }
]
pipe(
filter(whereEq({ title: 'Speaking JavaScript' })),
pluck('price'),
head,
mul(0.8)
)(data) // ?
Ramda 提供了 whereEq()
特別適合 Object Array:
whereEq()
{String: *} → {String: *} → Boolean
提供 Object Array 所需 predicate,適合直接判斷相等
{String: *}
:String
為 Object 的 property,*
則為判斷相等的值
{String: *} -> Boolean
:回傳 argument 為 Object 的 predicate
Conclusion
- 當 data 為 Object Array 時,且 predicate 使用
equals()
,建議都該使用whereEq()
產生 predicate,而非土法煉鋼使用pipe()
組合