點燈坊

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

使用 tug() 取得 Array 第一個 Element 的特定 Property

Sam Xiao's Avatar 2020-04-03

當 Knex 使用 count()sum() 時,回傳仍是 Array,且 count()sum() 的值是在特定 Property 內,可使用 tug() 可輕易取出其值。

Version

macOS Catalina 10.15.3
WebStorm 2019.3.3
MySQL 8.0.18
Knex 0.20.2
Wink-fp 1.20.66

Knex

mySQL('books')
  .sum({ sum: 'price' })
  .then(x => x[0].sum)
  .then(log)

使用 Knex 的 sum() 時,由於回傳 promise,需在 then()x => x[0].sum 才能取得其值。

Ramda

import { pluck, head } from 'ramda'
import { log } from 'wink-fp'

mySQL('books')
  .sum({ sum: 'price' })
  .then(pluck('sum'))
  .then(head)
  .then(log)

若要使 then() 也 point-free,需在 then() 使用 pluck()head() 兩個 function。

tug()

import { useWith, compose, head, pluck, identity } from 'ramda'
import { log } from 'wink-fp'

let tug = useWith(
  compose(head, pluck), [identity, identity]
)

mySQL('books')
  .sum({ sum: 'price' })
  .then(tug('sum'))
  .then(log)

為了要使 tug() 的 data 放在最後一個 argument,使用 useWith()identity() 配合,如此可以 tug() 取代 pluck()head()

Wink-fp

import { tug, log } from 'wink-fp'

mySQL('books')
  .sum({ sum: 'price' })
  .then(tug('sum'))
  .then(log)

Wink-fp 已經提供 tug() 可直接使用。

tug()
String -> [a] -> *
取得 Array 第一個 element 的特定 property

String:指定要回傳的 property 名稱

[a]:data 為 array

*:回傳該 property

tug000

Conclusion

  • 對於 Knex 的 count()sum() 這類 function,tug() 特別好用,讓我們不用組合 pluck()head()