點燈坊

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

使用 endsWith() 判斷是否以特定 String 結束

Sam Xiao's Avatar 2019-07-05

若要判斷 String 是否以特定 String 結尾,實務上較少遇到,且實現方式也比較少。

Version

macOS Mojave 10.14.5
VS Code 1.36.0
Quokka 1.0.233
Ramda 0.26.1

Regular Expression

let data = 'FP in JavaScript';

// startWith :: String -> String -> Boolean
let endsWith = postfix => str => new RegExp(`${postfix}$`).test(str);

endsWith('JavaScript')(data); // ?

最直覺方式是透過 RegExp$ 表示一行的結束。

endwith000

String.prototype.endsWith()

let data = 'FP in JavaScript';

// endsWith :: String -> String -> Boolean
let endsWith = postfix => str => str.endsWith(postfix);

endsWith('JavaScript')(data); // ?

ES6 新增了 String.prototype.endsWith(),可直接進行比較,語意更佳。

endwith001

Functional

import { pipe, takeLast, equals } from 'ramda';

let data = 'FP in JavaScript';

// endsWith :: String -> String -> Boolean
let endsWith = postfix => pipe(
  takeLast(postfix.length),
  equals(postfix)
);

endsWith('JavaScript')(data); // ?

撇開 ECMAScript 內建 function,若以 functional 角度思考:

  • 使用 takeLast() 先取得 postfix 長度的 string
  • 使用 equals() 比較 takeLast() 所回傳 string 是否與 postfix 相等

最後以 pipe() 整合所有流程,非常清楚。

endwith002

Ramda

import { endsWith } from 'ramda';

let data = 'FP in JavaScript';

endsWith('JavaScript')(data); // ?

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

endsWith()
String -> String -> Boolean
判斷 string 是否以特定 string 結束

String:要判斷的特定 string

String:data 為 string

Boolean:回傳判斷結果

endwith003

Conclusion

  • endsWith() 大都用在 string,其實也能用在 array
  • ES6 的 endsWith() 與 Ramda 的 endsWith() 功能相同,只是 ES6 為 OOP,而 Ramda 為 FP
  • Ramda 的 endsWith() 底層也是使用 takeLast()equals() 組合而成

Reference

MDN, String.prototype.endsWith()
Ramda, endsWith()
Ramda, pipe()
Ramda, takeLast()
Ramda, equals()