點燈坊

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

使用 dropRepeatsWith() 刪除 Array 連續重複資料

Sam Xiao's Avatar 2019-07-30

dropRepeats() 預設使用 equals() 判斷 Array 是否連續重複,若要提供自訂條件,就要使用 dropRepeatsWith()

Version

Ramda 0.27.1

Primitive

import { pipe, dropRepeatsWith } from 'ramda'

let data = [1, -1, 1, 3, 4, -4, -4, -5, 5, 3, 3]

pipe(
  dropRepeatsWith((x, y) => Math.abs(x) === Math.abs(y))
)(data) // ?

想將 Array 中絕對值相等的連續重複 element 刪除,Ramda 已經內建 dropRepeatsWith() 可直接使用。

dropRepeatsWith()
((a, a) → Boolean) → [a] → [a]
自訂 predicate 回傳不連續重複的新 Array

(a,a) -> Boolean:傳入自訂 predicate

[a]:data 為 Array

[a]:回傳不連續重複的新 Array

droprepeatswith000

Point-free

import { pipe, dropRepeatsWith, eqBy } from 'ramda'

let data = [1, -1, 1, 3, 4, -4, -4, -5, 5, 3, 3]

pipe(
  dropRepeatsWith(eqBy(Math.abs))
)(data) // ?

也可將 (x, y) => Math.abs(x) === Math.abs(y) 進一步使用 eqBy(Math.abs) Point-free。

droprepeatswith001

Object

import { pipe, dropRepeatsWith } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'Elm in Action', price: 200 },
  { title: 'Elm in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 },
  { title: 'FP in JavaScript', price: 100 },
  { title: 'FP in JavaScript', price: 100 },
]

pipe(
  dropRepeatsWith((x, y) => x.price === y.price)
)(data) // ?

dropRepeatsWith() 也能用在 Object,只要 price 相等就視為 Object 相等,這也是 dropRepeats() 做不到的。

droprepeatswith002

Point-free

import { pipe, dropRepeatsWith, eqProps } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'Elm in Action', price: 200 },
  { title: 'Elm in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 },
  { title: 'FP in JavaScript', price: 100 },
  { title: 'FP in JavaScript', price: 100 },
]

pipe(
  dropRepeatsWith(eqProps('price'))
)(data) // ?

也能將 (x, y) => x.price === y.price 進一步使用 eqProps() Point-free。

droprepeatswith003

Conclusion

  • dropRepeatsWith()可提供自訂判斷 predicate,尤其針對 Object 時特別有用

Reference

Ramda, dropRepeatsWith()