Ramda 之 where()
栏目: JavaScript · 发布时间: 5年前
内容简介:如VS Code 1.31.1Quokka 1.0.136
如 filter()
、 find()
這類 Operator,需要傳進 Predicate Function,若條件不只一個,就必須靠 &&
串起來,造成程式碼不容易理解。Ramda 特別提供了 where()
,專門負責產生這類 Predicate。
Version
VS Code 1.31.1
Quokka 1.0.136
Ramda 0.26.1
filter()
import { filter } from 'ramda'; const data = [ { id: 1, title: 'Impatient JavaScript', year: 2018 }, { id: 2, title: 'RxJS in Action', year: 2017 }, { id: 3, title: 'Speaking JavaScript', year: 2014 } ]; const getBooks = filter(x => x.title.includes('JavaScript') && x.year >= 2017); const result = getBooks(data); console.dir(result);
想要找出 title
包含 JavaScript
且 year
大於 2017 的 data
。
第 9 行
const getBooks = filter(x => x.title.includes('JavaScript') && x.year >= 2017);
使用了 Ramda 的 filter()
並搭配 predicate function,由於包含了兩個條件,因此必須使用 &&
才能串起來。
where()
import { filter, where, includes, __, gte } from 'ramda'; const data = [ { id: 1, title: 'Impatient JavaScript', year: 2018 }, { id: 2, title: 'RxJS in Action', year: 2017 }, { id: 3, title: 'Speaking JavaScript', year: 2014 } ]; const predicate = where({ title: includes('JavaScript'), year: gte(__, 2017) }); const getBooks = filter(predicate); const result = getBooks(data); console.dir(result);
where()
{String: (* → Boolean)} → {String: *} → Boolean
將眾多 predicate 以 object 形式整理,產生 &&
串起眾多 predicate
{String: (* → Boolean)}
: String
為 property 的 key,表示該 predicate 針對此 property; (* → Boolean)
為 predicate
{String: *}
:data 為 object
Boolean
:若符合 predicate 則傳回 true
,否則傳回 false
由於 where()
的 currying 特性,只要提供第一個參數,就會產生 {String: *} → Boolean
的 predicate 供 filter()
、 find()
… 等 operator 使用
第 9 行
const predicate = where({ title: includes('JavaScript'), year: gte(__, 2017) });
另外定義 predicate()
,由 where()
產生 function。
x => x.title.includes('JavaScript')
由於與 title
有關,所以 key 為 title
, includes()
則改用 Ramda 的 includes()
,才能回傳 function。
includes()
a -> [a] -> Boolean
若 value 存在於 array 內時,則傳回 true
,否則傳回 false
a
:要測試的 value
[a]
:data 為 array
Boolean
:若存在則傳回 true
,否則傳回 false
由於 includes()
的 currying 特性,只要提供第一個參數 value,就會產生 [a] -> Boolean
的 function,剛好適合給 where()
提供 function
x.year >= 2017
由於與 year
有關,所以 key 為 year
, >=
則改用 Ramda 的 gte()
,才能回傳 function。
gte()
Ord a => a → a → Boolean
若第一個參數大於第二個參數則傳回 true
,否則傳回 false
若寫成 gte(2017)
,則 year
將會放在第二個參數,就無法使用 gte()
,必須改用 lte()
,如此語意又與原本寫法不同,因此特別使用 gte()
與 __()
,將 year
改放在第一個參數。
__()
參數的 placeholder
我們可以發現原本由 &&
所組成的 predicate,改由 where()
之後,由於其 Point-free 特性, predicate()
只有包含邏輯部分,而沒有任何 data,變得非常清爽,可讀性更高。
14 行
const getBooks = filter(predicate);
由於 filter()
的 predicate 已經被抽成 function,改由 where()
產生。
Conclusion
-
where()
特別適合用來產生 predicate function 給filter()
、find()
之類的 operator 使用
Reference
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
驾驭未来:抓住奇点冲击下的商机
[日]斋藤和纪 / 南浩洁 / 中国友谊出版公司 / 2018-9 / 52.00元
2020年左右,AI(人工智能)将超越人类的智力水平。2045年,人类将迎来“奇点”——科技进步的速度达到无限大。 所有技术都在以空前的速度向前发展。同时,以往带来巨大财富的众多技术将走向“非货币化”。当下,人类正面临着被AI夺去工作的危机。许多传统行业(例如汽车制造业)将被彻底颠覆,但新的机会也在酝酿,技术的进步使得带宽成本、计算成本、存储成本等创新成本趋近于0,创业不再是资本、技术或信息......一起来看看 《驾驭未来:抓住奇点冲击下的商机》 这本书的介绍吧!