點燈坊

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

使用 any() 判斷 Array 符合條件是否存在

Sam Xiao's Avatar 2021-01-02

實務上我們常需判斷 Array 是否 任意 資料符合某條件,若存在則傳回 true,若不存在則傳回 false,Ramda 提供了 any() 可判斷。

Version

Ramda 0.27.1

Array.prototype.some()

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

data.some(x => x.price <= 100) // ?

想得知是否存在 任何 price 小於等於 100,若存在則回傳 true,否則回傳 false,ECMAScript 已經提供 some() 可直接使用。

any003

any()

import { pipe, any } from 'ramda'

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

pipe(
  any(x => x.price <= 100)
)(data) // ?

Ramda 則提供 curry 版本的 any()

any()
(a -> Boolean) -> [a] -> Boolean
判斷 Array 中資料是否存在符合條件資料

(a -> Boolean): 判斷條件 predicate

[a]:data 為 Array

Boolean:回傳比較結果

any002

Point-free

import { pipe, any, where, lte, __ } from 'ramda'

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

pipe(
  any(where({ price: lte(__, 100)}))
)(data) // ?

any() 的 callback 也可改用 where()lte() 產生使其 Point-free。

any004

propLte()

import { pipe, any } from 'ramda'
import { propLte } from 'wink-fp'

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

pipe(
  any(propLte('price', 100))
)(data) // ?

也可使用 Wink-fp 的 propLte() 語意更佳且更精簡。

any001

Conclusion

  • any() 相當於內建的 Array.prototype.some(),只是 some() 為 Method Chaining,而 any() 為 Function Pipeline

Reference

Ramda, any()