使用 none() 判斷 Array 中資料是否全部不符合條件

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

Version

macOS Mojave 10.14.5

VS Code 1.33.0

Quokka 1.0.205

Ramda 0.26.1

Imperative

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

// none :: (a -> Boolean) -> [a] -> Boolean
let none = pred => arr => {
  for (let elem of arr) {
    if (pred(elem)) return false;
  }
  return true;
};

none(x => x.price === 400)(data); // ?

建立 none() ,Imperative 會使用 for loop 搭配 if 判斷,若符合條件就直接回傳 false ,若都不符合條件則回傳 true

Functional

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 }
];

// none :: (a → Boolean) → [a] → Boolean
let none = compose(complement, any);

none(x => x.price === 400)(data); // ?

其實仔細想一想, none() 不就是 not any() 嗎 ? 因此我們也可以將 complement()any() 組合產生 none()

complement()

(*… → *) → (*… → Boolean)

將原本回傳 true 的 function 變成傳回 false 的 function,反之亦然

Ramda

import { none } from 'ramda';

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

none(x => x.price === 400)(data); // ?

其實 Ramda 已經內建 none() ,可直接使用。

none()

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

判斷 array 中資料是否全部不符合條件

(a -> Boolean) : 判斷條件

[a] :data 為 array

Boolean :回傳比較結果

Point-free

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 }
];

let pred = propSatisfies(gte(__, 400), 'price'); 

none(pred)(data); // ?

none() 的 callback 也可改用 propSatisfies() 產生,語意更佳。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章