點燈坊

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

使用 all() 判斷 Array 是否全部符合條件

Sam Xiao's Avatar 2020-12-30

實務上我們常需判斷 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() 可直接使用。

all003

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:回傳比較結果

all003

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。

all002

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() 語意更佳且更精簡。

all002

Conclusion

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

Reference

Ramda, all()