點燈坊

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

使用 startsWith() 判斷是否以特定 Array 開始

Sam Xiao's Avatar 2019-07-05

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

Version

macOS Mojave 10.14.5
VS Code 1.35.1
Quokka 1.0.233
Ramda 0.26.1

Functional

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

let data = [1, 2, 3];

// startWith :: [a] -> [a] -> Boolean
let startsWith = prefix => pipe(
  take(prefix.length),
  equals(prefix)
);

startsWith([1, 2])(data); // ?

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

  • 使用 take() 先取得 prefix 長度的 string

  • 使用 equals() 比較 take() 所回傳 string 是否與 prefix 相等

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

startswith008

Ramda

import { startsWith } from 'ramda';

let data = [1, 2, 3];

startsWith([1, 2])(data); // ?

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

startsWith()
String → String → Boolean
判斷 string 是否以特定 string 開始

String:要判斷的特定 string

String:data 為 string

Boolean:回傳判斷結果

startswith003

Array

import { startsWith } from 'ramda';

let data = [1, 2, 3];

startsWith([1, 2])(data); // ?

startsWith() 不只能用在 string,也能用在 array。

startsWith()
[a] → [a] → Boolean
判斷 array 是否以特定 array 開始

[a]:要判斷的特定 array

[a]:data 為 array

Boolean:回傳判斷結果

startswith004

Object

import { startsWith } from 'ramda';

let data = [
  { title: 'FP in JavaScript', price: 300 },
  { title: 'RxJS in Action', price: 400 },
  { title: 'Speaking JavaScript', price: 200 }
];

let prefix = [
  { title: 'FP in JavaScript', price: 300 },
  { title: 'RxJS in Action', price: 400 },
];

startsWith(prefix)(data); // ?

startsWith() 也能用在 object。

startswith005

Conclusion

  • startsWith() 大都用在 string,其實也能用在 array
  • Ramda 的 startsWith() 底層也是使用 take()equals() 組合而成

Reference

Ramda, startsWith()
Ramda, pipe()
Ramda, take()
Ramda, equals()