實務上我們常需判斷 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()
可直接使用。
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
:回傳比較結果
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。
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()
語意更佳且更精簡。
Conclusion
any()
相當於內建的Array.prototype.some()
,只是some()
為 Method Chaining,而any()
為 Function Pipeline