實務上常遇到中間 String 符合預期,但後面 String 不符合規格,此時可用 dropLast()
加以刪除。
Version
Ramda 0.27.1
slice()
import { pipe, slice, subtract, __, length } from 'ramda'
let data = 'FP in JavaScript'
let dropLast = n => s => pipe(
length,
subtract(__, n),
slice(0, __, s)
)(s)
dropLast(13)(data) // ?
若我們不知道 Ramda 已經提供 dropLast()
也沒關係,可透過 subtract()
與 slice()
組合出 dropLast()
。
- 使用
length()
取得 string 的 length,相當於str.length
- 使用
subtract()
取得slice()
的結束 index,相當於str.length - n
- 使用
slice()
舉得前半段未刪除的 element
最後使用 pipe()
組合所有 function,非常清楚。
Point-free
import { pipe, slice, subtract, length, converge, identity, flip } from 'ramda'
let data = 'FP in JavaScript'
let dropLast = n => converge(
slice(0), [
pipe(length, flip(subtract)(n)),
identity,
]
)
dropLast(13)(data) // ?
若想將最後一個 data argument s
point-free,由 pipe()
寫法可發現:
slice(0)
為實質最後執行 functionlength()
與subtract()
為了準備slice(0)
第一個 argument,但也需要str
slice(0)
第二個 argument 為s
由於第一個 argument 與第二個 argument 都需要 s
,明顯暗示需使用 converge()
才能 Point-free。
drop()
import { drop, reverse, pipe } from 'ramda'
let data = 'FP in JavaScript'
let dropLast = n => s => pipe(
reverse,
drop(n),
reverse
)(s)
dropLast(13)(data) // ?
也可使用 drop()
與 reverse()
組合出 dropLast()
。
dropLast()
與 drop()
相當類似,只是 drop()
刪除 string 前幾筆資料,而 dropLast()
刪除 string 最後幾筆資料。
- 使用
reverse()
將 string 反轉 - 使用
drop()
將 string 前幾筆資料刪除 - 使用
reverse()
再將 string 反轉
最後使用 pipe()
組合所有 function,非常清楚。
Point-free
import { drop, reverse, pipe } from 'ramda'
let data = 'FP in JavaScript'
let dropLast = n => pipe(
reverse,
drop(n),
reverse
)
dropLast(13)(data) // ?
dropLast()
最後一個 data argument 也可省略成為 Point-free。
Ramda
import { dropLast } from 'ramda'
let data = 'FP in JavaScript'
dropLast(13, data) // ?
事實上 Ramda 已經內建 dropLast()
可直接使用。
dropLast()
Number → String → String
刪除 string 最後幾個 char 並回傳
Conclusion
- String 無法如同 Array 一般靠設定
length
property 改變 String 長度 dropLast()
可使用slice()
或drop()
實現dropLast()
不只用在 String,也能用於 Array