點燈坊

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

使用 dropLastWhile() 刪除 Array 最後幾筆資料

Sam Xiao's Avatar 2019-07-29

dropLast() 只能刪除 Array 固定最後幾筆資料,若想自行提供自訂條件 Predicate,就得使用 dropLastWhile()

Version

Ramda 0.27.1

Primitive

import { pipe, dropLastWhile } from 'ramda'

let data = [1, 2, 3, 4, 3, 2, 1]

pipe(
  dropLastWhile(x => x <= 2)
)(data) // ?

想將 Array 中最後幾筆小於等於 2 的 element 刪除,Ramda 已經內建 dropLastWhile() 可直接使用。

dropLastWhile()
(a -> Boolean) → [a] → [a]
根據 predicate 刪除 Array 最後幾筆資料

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

[a]:data 為 Array

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

droplastwhile000

Point-free

import { pipe, dropLastWhile, gte } from 'ramda'

let data = [1, 2, 3, 4, 3, 2, 1]

pipe(
  dropLastWhile(gte(2))
)(data) // ?

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

droplastwhile001

Object

import { pipe, dropLastWhile } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 101 },
  { title: 'RxJS in Action', price: 203 },
  { title: 'Speaking JavaScript', price: 300 }
]

pipe(
  dropLastWhile(x => x.price > 250)
)(data) // ?

dropLastWhile() 也能用在 Object。

droplastwhile002

Point-free

import { pipe, dropLastWhile, where, lte } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 101 },
  { title: 'RxJS in Action', price: 203 },
  { title: 'Speaking JavaScript', price: 300 }
]

pipe(
  dropLastWhile(where({ price: lte(250) }))
)(data) // ?

也可將 x => x.price > 250 進一步 Point-free:

  • where({ price: lte(250) }):對 price property 使用 lte(250) 判斷

droplastwhile003

Conclusion

  • dropWhle()dropLastWhile() 用法很類似,但 dropWhile() 是刪除符合條件前 n 筆資料,而 dropLastWhile() 是刪除符合條件最後 n 筆資料
  • dropWhile() 除了用在 Array,也能用在 String

Reference

Ramda, dropLastWhile()