點燈坊

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

使用 includes() 判斷資料是否存在於 String

Sam Xiao's Avatar 2019-07-05

實務上我們常需判斷某一個值是否存在於 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。

includes000

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

includes001

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() 是資料 找到

includes002

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:回傳比較結果

includes003

Conclusion

  • 若不知道 includes() 也沒關係,也可使用 indexOf()equals()not() 加以組合
  • includes() 也能用在於 array

Reference

Ramda, includes()
Ramda, any()