若要判斷 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
,$
表示一行的結束。
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()
,可直接進行比較,語意更佳。
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()
整合所有流程,非常清楚。
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
:回傳判斷結果
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()