判斷符合條件的值是否不存在於 array

實務上我們常需判斷 Array 是否全部 符合某條件,若都不存在則傳回 true,否則傳回 false

Version


VS Code 1.33.0
Quokka 1.0.205
Ramda 0.26.1

Imperative


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let data = [
{ title: 'FP in JavaScript', price: 100 },
{ title: 'RxJS in Action', price: 200 },
{ title: 'Speaking JavaScript', price: 300 }
];

let none = cb => data => {
for (let item of data) {
if (cb(item)) return false;
}
return true;
};

console.log(none(x => x.price === 100)(data));
console.log(none(x => x.price === 400)(data));

建立 none(),Imperative 會使用 for loop 搭配 if 判斷,若找到資料就直接回傳 false 結束,若都找不到則回傳 true

none000

any()


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

let data = [
{ title: 'FP in JavaScript', price: 100 },
{ title: 'RxJS in Action', price: 200 },
{ title: 'Speaking JavaScript', price: 300 }
];

let none = compose(
complement,
any
);

console.log(none(x => x.price === 100)(data));
console.log(none(x => x.price === 400)(data));

其實仔細想一想,none() 不就是 not any() 嗎 ?

沒錯,因此我們也可以將 complement()any() 組合起來產生 none()

complement()
(*… → *) → (*… → Boolean)
將原本回傳 true 的 function 變成傳回 false 的 function,反之亦然

none001

none()


1
2
3
4
5
6
7
8
9
10
import { none, propSatisfies, gte, __ } from 'ramda';

let data = [
{ title: 'FP in JavaScript', price: 100 },
{ title: 'RxJS in Action', price: 200 },
{ title: 'Speaking JavaScript', price: 300 }
];

console.log(none(propSatisfies(gte(__, 100), 'price'))(data));
console.log(none(propSatisfies(gte(__, 400), 'price'))(data));

事實上 Ramda 已經內建 none() ,且 callback 也可改用 propSatisfies() 產生,語意更佳。

none()
(a -> Boolean) -> [a] -> Boolean

判斷符合條件的值是否 存在於 array

(a -> Boolean): 判斷條件

[a]:data 為 array

Boolean:回傳比較結果

none002

Conclusion


  • ECMAScript 並沒有內建 none()
  • none() 也可以使用 any() 組合出來,再次見證 Function Composition 的威力
  • none() 的 callback 也可用 Ramda 的 function 產生,Point-free 更精簡,且可讀性更高

Reference


Ramda, none()
Ramda, any()
Ramda, complement()
Ramda, propSatisfies()
Ramda, lte()
Ramda, __()