點燈坊

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

使用 dropWhile() 根據自訂條件刪除 String 前幾個 Char

Sam Xiao's Avatar 2019-07-28

drop() 只能刪除 String 固定前幾個 Char,若想自行提供自訂條件 Predicate,就得使用 dropWhile()

Version

macOS Mojave 10.14.5
VS Code 1.36.1
Quokka 1.0.238
Ramda 0.26.1

Imperative

let data = 'FP in JavaScript';

// dropWhile :: (a -> Boolean) -> String -> String
let dropWhile = pred => str => {
  let i = 0;
  
  while(i < str.length && pred(str[i])) {
    i++;
  }

  return str.slice(i);
};

dropWhile(x => x !== 'J')(data); // ?

dropWhile() 意義為當 predicate 為 true 時刪除 char,直到 false 時停止刪除。

建立 dropWhile(),imperative 會使用 while loop,當 i 小於 length 且 predicate 為 truei 增加 1 ,最後使用 slice() 回傳剩餘 string。

dropwhile000

Ramda

import { dropWhile } from 'ramda';

let data = 'FP in JavaScript';

dropWhile(x => x !== 'J')(data); // ?

Ramda 已經提供 dropWhile(),可直接使用。

dropWhile()
(a → Boolean) → [a] → [a]
根據自訂條件刪除 array 前幾筆資料

(a -> Boolean):自訂條件 predicate

[a]:data 為 array

[a]:回傳刪除 array 前幾筆資料後的剩餘 array

dropwhile001

Point-free

import { dropWhile, equals, complement } from 'ramda';

let data = 'FP in JavaScript';

let pred = complement(equals)('J');

dropWhile(pred)(data); // ?

也可將 x => x <= 2 進一步使用 gte(2) 使之 point-free。

dropwhile002

Conclusion

  • dropWhle()takeWhile() 用法很類似,但 takeWhile() 是取得符合條件前 n 個 char,而 dropWhile() 是刪除符合條件前 n 個 char
  • dropWhile() 除了用在 string,也能用在 array

Reference

Ramda, dropWhile()