實務上我們常需判斷某一個值是否存在於 String 內,若存在則傳回 true
,若不存在則傳回 false
,對於簡單的需求,我們會希望不要傳入 Callback,直接傳入 String 即可。
Version
macOS Mojave 10.14.5
VS Code 1.36.0
Quokka 1.0.233
Ramda 0.26.1
String.prototype.indexOf()
let data = 'FP in JavaScript';
// includes :: String -> String -> Boolean
let includes = arg => str => str.indexOf(arg) !== -1
includes('JavaScript')(data); // ?
可使用 String.prototype.indexOf()
判斷資料是否存在,若不存在回傳 -1
,存在回傳 index。
String.prototype.includes()
let data = 'FP in JavaScript';
// includes :: String -> String -> Boolean
let includes = arg => str => str.includes(arg);
includes('JavaScript')(data); // ?
String.prototype
內建 includes()
,直接傳入 data 即可。
就功能而言兩者都一樣,但
String.prototype.includes()
屬 OOP 風格,為 data 的 method,而includes()
為 FP 風格,data 以 argument 傳入 function,且為最後一個 argument,方便 point-free
Functional
import { pipe, indexOf, equals, not } from 'ramda';
let data = 'FP in JavaScript';
// includes :: String -> String -> Boolean
let includes = arg => pipe(
indexOf(arg),
equals(-1),
not
);
includes('JavaScript')(data); // ?
若以 functional 角度思考:
- 使用
indexOf()
判斷資料是否存在於 string - 使用
equals()
判斷是否-1
沒找到 - 使用
not()
將結果反轉,因為includes()
是資料找到
Ramda
import { includes } from 'ramda';
let data = 'FP in JavaScript';
includes('JavaScript', data); // ?
事實上 Ramda 已經內建 includes()
,可直接使用。
includes()
String -> String -> Boolean
判斷 data 是否存在於 string
string
: 欲判斷的 data
string
:data 為 string
Boolean
:回傳比較結果
Conclusion
- 若不知道
includes()
也沒關係,也可使用indexOf()
、equals()
與not()
加以組合 includes()
也能用在於 array