實務上我們常需判斷 Array 是否 全部
符合某條件,若存在則傳回 true
,若不存在則傳回 false
,可使用 all()
判斷。
Version
Ramda 0.27.1
Array.prototype.every()
let data = [
{ title: 'FP in JavaScript', price: 100 },
{ title: 'Elm in Action', price: 200 },
{ title: 'Speaking JavaScript', price: 300 }
]
data.every(x => x.price >= 100) // ?
想得知是否 所有
price 都大於等於 100
,若存在則回傳 true
,否則回傳 false
,ECMAScript 已經提供 every()
可直接使用。
all()
import { pipe, all } from 'ramda'
let data = [
{ title: 'FP in JavaScript', price: 100 },
{ title: 'Elm in Action', price: 200 },
{ title: 'Speaking JavaScript', price: 300 }
]
pipe(
all(x => x.price >= 100)
)(data) // ?
Ramda 則提供 curry 版本的 all()
。
all()
(a → Boolean) → [a] → Boolean
判斷 Array 中資料是否全部資料符合條件
(a -> Boolean)
: 判斷條件 predicate
[a]
:data 為 Array
Boolean
:回傳比較結果
Point-free
import { pipe, all, where, gte, __ } from 'ramda'
let data = [
{ title: 'FP in JavaScript', price: 100 },
{ title: 'Elm in Action', price: 200 },
{ title: 'Speaking JavaScript', price: 300 }
]
pipe(
all(where({ price: gte(__, 100) }))
)(data) // ?
all()
的 callback 也可改用 where()
與 gte()
產生使其 Point-free。
propGte()
import { pipe, all } from 'ramda'
import { propGte } from 'wink-fp'
let data = [
{ title: 'FP in JavaScript', price: 100 },
{ title: 'Elm in Action', price: 200 },
{ title: 'Speaking JavaScript', price: 300 }
]
pipe(
all(propGte('price', 100))
)(data) // ?
也可使用 Wink-fp 的 propGte()
語意更佳且更精簡。
Conclusion
all()
相當於內建的Array.prototype.every()
,只是every()
為 Method Chaining,而all()
為 Function Pipeline