將眾多 predicate 組合成單一 predicate,必須所有的 predicate 同時都不成立

Ramda 有提供 anyPass()allPass(),卻沒有提供 nonePass(),沒關係,藉由 Function Composition,我們也可以自行組合出 nonePass()

Version


VS Code 1.33.0
Quokka 1.0.205
Ramda 0.26.1

nonePass


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import { anyPass, propEq, compose, complement, includes, propSatisfies } from 'ramda';

let data = { title: 'Rx in Action', price: 200 };

let nonePass = compose(
complement,
anyPass
);

let isBadBook = nonePass([
propEq('price', 400),
propSatisfies(includes('JavaScript'), 'title')
]);

console.log(isBadBook(data));

若不存在 price400 ,也不包含 titleJavaScript,則傳回 true,否則傳回 false

none() 可藉由complement()any() 組合出來,同理,nonePass() 也可藉由 complement()anyPass() 組合出來。

nonepass000

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import { anyPass, propEq, compose, complement, includes, propSatisfies, all } from 'ramda';

let data = [
{ title: 'Exloring ES6', price: 100 },
{ title: 'RxJS in Action', price: 200 },
{ title: 'Exploring ReasonML', price: 300 }
];

let nonePass = compose(
complement,
anyPass
);

let isBadBook = nonePass([
propEq('price', 400),
propSatisfies(includes('JavaScript'), 'title')
]);

console.log(all(isBadBook)(data));

若 array 所有 object 都不符合條件則傳回 true,否則傳回 false

使用 all()nonePass() 組合,則可針對 array 做判斷。

nonepass001

Conclusion


  • 因為較少使用,Ramda 並有提供 nonePass(),但藉由 Function Composition,我們仍可使用 complement()anyPass() 組合出 nonePass()
  • nonePass() 要配合 array 時比較 tricky,並不是 none() 而是 all(),因為 nonePass() 已經做過一次 反向邏輯,再使用 none() 會變成 負負得正 效果,因此只能用 all()

Reference


Ramda, compose()
Ramda, complement()
Ramda, anyPass()
Ramda, propEq()
Ramda, propSatisfies()
Ramda, includes()
Ramda, all()