點燈坊

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

使用 of() 建立 Array

Sam Xiao's Avatar 2020-03-01

有不少 Function 的 Arguemtn 要求 Array,如 pick()project(),此時可先使用 of() 先建立 Array 之後再傳給 Function。

Version

macOS Catalina 10.15.3
VS Code 1.42.1
Quokka 1.0.277
Ramda 0.27.0

pick()

import { map, pick } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 }
]

let f = v => map(pick([v]))

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

當使用 pick() 產生 map() 所需的 callback 時,其 argument 要求為 array,可使用 [] operator 產生 array。

of000

of()

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

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 }
]

let of = v => [v]

let f = compose(map, pick, of)

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

但只要使用 operator 都會遇到一個問題:無法 point-free。

因為 compose() 需要的是 function。

因此可自行建立 of() 產生 array。

of001

Ramda

import { map, pick, compose, of } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 }
]

let f = compose(map, pick, of)

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

Ramda 已經內建 of() 可直接使用。

of()
a → [a]
將任意值包成 array

of002

project()

import { project } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 }
]

let f = v => project([v])

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

map(pick()) 可由 project() 取代,但 argument 要求依然是 array。

of003

Function Composition

import { compose, project, of } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 }
]

let f = compose(project, of)

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

也可使用 compose() 組合 project()of()

of004

Conclusion

  • 實務上不會使用 of() 建立 array,但會用於 callback 中需要 array argument 時組合 of() 使用

Reference

Ramda, of()
Ramda, map()
Ramda, pick()
Ramda, project()
Ramda, compose()