點燈坊

失くすものさえない今が強くなるチャンスよ

使用 whereEq() 產生 Object 的 Predicate

Sam Xiao's Avatar 2020-12-07

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() 組合

這樣雖然可行,但可讀性較差。

whereeq000

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

whereeq001

Conclusion

  • 當 data 為 Object Array 時,且 predicate 使用 equals(),建議都該使用 whereEq() 產生 predicate,而非土法煉鋼使用 pipe()組合

Reference

Ramda, where()
Ramda, whereEq()