點燈坊

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

使用 nth() 根據指定 Index 取得 String 的 Char

Sam Xiao's Avatar 2020-03-30

ECMAScript 會使用 [] 根據 Index 取得 String 的 Char,但 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 str = 'abc'

str[1] // ?
str.charAt(1) // ?

標準 ECMAScript 會使用 [] 取得指定 index 的 char,也可使用 charAt()

nth000

nth()

let str = 'abc'

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

nth(1)(str) // ?

可自行將 [] 包成 nth()

nth001

Ramda

import { nth } from 'ramda'

let str = 'abc'

nth(1)(str) // ?
nth(-1)(str) // ?

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

nth()
Number → String -> String
根據指定 index 取得 string 的 char

Number:傳入指定 index

String:data 為 string

String:若 char 存在則回傳,否則回傳 empty string

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

Application

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

let str = 'abc'

let f = pipe(
  inc,
  nth
)

f(1)(str) // ?

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

nth002

Conclusion

  • Operator 看似精簡,但只適用於 imperative,若要真的發揮 FP 威力,就必須將 operator 包裝成 function
  • nth() 用於 array 則可能回傳 undefined,若用於 string 只會回傳 empty string,不會回傳 undefined

Reference

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