點燈坊

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

使用 nth() 根據指定 Index 取得 Array 的 Element

Sam Xiao's Avatar 2020-03-30

ECMAScript 會使用 [] 根據 Index 取得 Array 的 Element,但 Operator 對於 Function Composition 並不方便,Ramda 另外提供了 nth() 取代之。

Version

macOS Catalina 10.15.4
VS Code 1.43.2
Quokka 1.0.284
Ramda 0.27.0

[] Operator

let data = [1, 2, 3]

data[1] // ?

標準 ECMAScript 會使用 [] 取得指定 index 的 element。

nth000

nth()

let data = [1, 2, 3]

let nth = n => arr => arr[n]

nth(1)(data) // ?

可自行將 [] 包成 nth()

nth001

Ramda

import { nth } from 'ramda'

let data = [1, 2, 3]

nth(1)(data) // ?
nth(-1)(data) // ?

Ramda 已經提供 nth() 可直接使用。

nth()
Number → [a] → a | Undefined
根據指定 index 取得 array 的 element

Number:傳入指定 index

[a]:data 為 array

a | Undefined:若 element 存在則回傳,否則回傳 undefined

nth()[] 不同之處還支援 index 為 負數-1 及為最後一個 element,-2 為倒數第二 element,以此類推

nth002

Application

import { nth, inc, pipe } from 'ramda'

let data = [1, 2, 3]

let f = pipe(
  inc,
  nth
)

f(1)(data) // ?

nth() 有什麼用呢 ? 若我們想將傳入 index 加 1 之後在取得其 element,可直接使用 pipe() 組合 inc()nth() 即可,但若使用 [] 則辦不到。

nth003

Conclusion

  • Operator 看似精簡,但只適用於 imperative,若要真的發揮 FP 威力,就必須將 operator 包裝成 function
  • nth() 為少數會回傳 undefined 的 function,需小心使用,必要時可搭配 either() 提供 undefined 的預設值避免 runtime error

Reference

Ramda, nth()
Ramda, inc()
Ramda, pipe()
Ramda, either()