點燈坊

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

使用 slice() 取得部分 String

Sam Xiao's Avatar 2020-01-29

Ramda 也如原生 ECMAScript 提供 slice(),唯 Ramda 的 slice() 是以 FP 形式呈現。

Version

macOS Mojave 10.15.2
VS Code 1.41.1
Quokka 1.0.275
Ramda 0.26.1

Imperative

let data = 'FP in JavaScript'

let slice = begin => end => str => {
  let result = ''

  for(let i = 0; i < str.length; i++)
    if (i >= begin && i < end)
      result += str[i]

  return result
}

slice(6)(16)(data) // ?

Imperative 會先建立欲回傳的 result string,使用 for loop 搭配 if 判斷,若 index 在傳進的 beginend 之中,則塞進 result 中。

slice005

slice()

let data = 'FP in JavaScript'

let slice = begin => end => str => str.slice(begin, end)

slice(6)(16)(data) // ?

ECMAScript 原生的 String.prototype 已內建 slice(),可直接使用。

slice009

Functional

import { invoker } from 'ramda'

let data = 'FP in JavaScript'

let slice = invoker(2, 'slice')

slice(6)(16)(data) // ?

亦可使用 invoker() 調用 String.prototypeslice()

slice006

Ramda

import { slice } from 'ramda'

let data = 'FP in JavaScript'

slice(6)(16)(data) // ?

Ramda 亦內建 slice(),可直接使用。

slice()
Number -> Number -> String -> String
回傳 string 的一部分

Number:string 的起始 index

Number:string 的結束 index (但不包含)

[a]:data 為 string

[a]:回傳新的部分 string

slice000

import { slice } from 'ramda'

let data = 'FP in JavaScript'

slice(6)(Infinity)(data) // ?

若要回傳到 array 最後一個 element,直接傳入 Infinity 即可。

Array.prototype.slice() 只要省略不傳即可,因為 ECMAScript 支援 optional parameter,預設就是最後一個 element;但 Ramda 不支援 optional parameter,而支援 partial application,因此一定要明確傳入 Infinity

slice001

import { slice } from 'ramda'

let data = 'FP in JavaScript'

slice(6)(-6)(data) // ?

Index 也可以傳入負數,其中 -1 就是最後一個 element,-2 就是倒數第二個 element,以此類推。

Array.prototype.slice() 的 index 也支援負數

slice002

import { slice } from 'ramda'

let data = 'FP in JavaScript'

slice(-10)(-6)(data) // ?

也可以兩個參數都是負數。

slice003

Conclusion

  • slice() 底層也是呼叫 String.prototype.slice(),因此所有特性與原生的 slice() 相同,唯原生的 slice() 是以 OOP 設計,slice() 為 string 的 method;而 Ramda 的 slice() 是以 FP 設計,string 以參數傳入,且在最後一個參數,方便做 point-free
  • 由於 Ramda 不支援 optional parameter,而支援 partial application,因此第二個參數不能省略,若要抓到最後一個 element,要明確傳入 Infinity

Reference

Ramda, slice()