判斷 object 的 property 是否滿足條件

propEq() 是針對 Object 常用的 Predicate,但若不是 equals(),而是如 gte()gt()lte()lt() 呢 ? 那就得使用 propSatisfies()

Version


VS Code 1.33.0
Quokka 1.0.205
Ramda 0.26.1

propSatisfies()


1
2
3
4
5
6
7
let obj = {
name: 'Sam',
age: 20
};

let isAdult = obj => obj.age >= 18;
console.log(isAdult(obj));

isAdult() 藉由傳入的 object 判斷 age property 是否大於等於 18

這樣寫雖然可行,但 property name 與所判斷的 value 都寫死了。

prop000

1
2
3
4
5
6
7
8
9
let obj = {
name: 'Sam',
age: 20
};

let propSatisfies = (pred, name) => obj => pred(obj[name]);

let isAdult = propSatisfies(x => x >= 18, 'age');
console.log(isAdult(obj));

自行寫了 propSatisfies(),第一個參數將判斷條件以 predicate function 傳入,第二個參數則傳入 property name,如此 function 可重用性就很高,幾乎所有的情況都適用。

prop001

1
2
3
4
5
6
7
8
9
import { propSatisfies } from 'ramda';

let obj = {
name: 'Sam',
age: 20
};

let isAdult = propSatisfies(x => x >= 18, 'age');
console.log(isAdult(obj));

事實上 Ramda 已經內建 propSatisfies(),可直接使用。

propSatisfies()
(a → Boolean) → String → {String: a} → Boolean
判斷 object 的 property 是否滿足條件

(a → Boolean):描述條件的 predicate

String:object 的 property 名稱

{String: a}:data 為 object

Boolean:若符合 predicate 要求則傳回 true,否則回傳 false

Conclusion


  • propSatisfies() 最大的用處是提供其他 function 的 prdicate,若是 equals() 就直接使用 propEq(),若是 gte()gt()lte()lt() 就使用 propSatisfies()
  • 自行實作 propGte()propGt()propLte()propLt() function 也是可行的方式,若以語意角度,propGte() 會比 propSatisfies() 更精確

Reference


Ramda, propSatisfies()