點燈坊

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

使用 objOf() 建立 Object

Sam Xiao's Avatar 2020-03-01

objOf() 表面上是提供 Key / Value 產生 Object,但實務上大部分都是利用其 Currying 特性,產生其他 Function 所需的 Callback。

Version

macOS Mojave 10.15.3
VS Code 1.42.1
Quokka 1.0.280
Ramda 0.27.0

objOf()

let objOf = k => v => {
  let obj = {}
  obj[k] = v
  return obj
}

objOf('price')(100); // ?

若想建立 objOf(),只要提供 keyval,就能建立 object 回傳,我們可輕易自行實現。

objof000

Ramda

import { objOf } from 'ramda'

objOf('price')(100) // ?

事實上 Ramda 已經提供 objOf() 可直接使用。

objOf()
String -> a -> {String: a}
提供 key 與 value 建立 object

String:提供 object 的 key

a:提供 object 的 value

{String: a}:回傳新建立 object

objof001

Callback

import { map } from 'ramda'

let data = [100, 200, 300]

let f = v => map(x => ({ [v]: x }))

f('price')(data) // ?

希望透過 map() 建立 array of object。

import { map, objOf } from 'ramda'

let data = [100, 200, 300]

let f = v => map(objOf(v))

f('price')(data) // ?

若只是使用 objOf() 建立 object,那就將 objOf() 用小了。

別忘了 objOf() 提供 currying 形式,所以只要提供 key 即可回傳以 value 為 x 的 callback,使 map() 的 callback 也能 point-free。

objof002

Function Composition

import { map, objOf, compose } from 'ramda'

let data = [100, 200, 300]

let f = compose(map, objOf)

f('price')(data) // ?

也可使用 compose()map()objOf() 組合起來使 f() 能 point-free。

objof003

Conclusion

  • 只要在 callback 內建立 object,就可考慮使用 objOf() 使 callback 能 point-free

Reference

Ramda, objOf()
Ramda, map()
Ramda, compose()