點燈坊

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

使用 dropLast() 刪除 String 最後幾個 Char

Sam Xiao's Avatar 2021-01-20

實務上常遇到中間 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,非常清楚。

droplast001

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) 為實質最後執行 function
  • length()subtract() 為了準備 slice(0) 第一個 argument,但也需要 str
  • slice(0) 第二個 argument 為 s

由於第一個 argument 與第二個 argument 都需要 s,明顯暗示需使用 converge() 才能 Point-free。

droplast002

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,非常清楚。

droplast003

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。

droplast004

Ramda

import { dropLast } from 'ramda'

let data = 'FP in JavaScript'

dropLast(13, data) // ?

事實上 Ramda 已經內建 dropLast() 可直接使用。

dropLast()
Number → String → String
刪除 string 最後幾個 char 並回傳

droplast005

Conclusion

  • String 無法如同 Array 一般靠設定 length property 改變 String 長度
  • dropLast() 可使用 slice()drop() 實現
  • dropLast() 不只用在 String,也能用於 Array

Reference

Ramda, dropLast()