Ramda 之 whereEq()
栏目: JavaScript · 发布时间: 5年前
内容简介:Ramda 的VS Code 1.31.1Quokka 1.0.136
Ramda 的 where()
可產生多個以 &&
串起來的 Predicate,但若針對 Object,且都是 ===
的 Predicate,就可以使用 whereEq()
更為精簡。
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 item = { title: 'RxJS in Action', year: 2017 }; const getBooks = filter( x => x.title === item.title && x.year === item.year ); const result = getBooks(data); console.dir(result);
想要找出 title
等於 RxJS in Action
且 year
等於 2017 的 data
,且條件以 object 方式呈現。
11 行
const getBooks = filter( x => x.title === item.title && x.year === item.year );
使用了 Ramda 的 filter()
並搭配 predicate function,由於包含了兩個條件,因此必須使用 &&
串起來。
whereEq()
import { filter, whereEq } 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 item = { title: 'RxJS in Action', year: 2017 }; const getBooks = filter(whereEq(item)); const result = getBooks(data); console.dir(result);
filter()
的 predicate 可由 whereEq()
產生。
whereEq()
{String: *} → {String: *} → Boolean
比對兩個 object 的 property 是否相等
{String: *}
:Spec object
{String: *}
:Test object
Boolean
:若相等傳回 true
,否則傳回 false
Spec object 的 property 可以少於 Test object
compose()
import { filter, whereEq, compose } 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 item = { title: 'RxJS in Action', year: 2017 }; const getBooks = compose( filter, whereEq(item) )(); const result = getBooks(data); console.dir(result);
原本 11 行
const getBooks = filter(whereEq(item));
先執行 whereEq()
,再將結果傳給 filter()
執行,因此也可以將 whereEq()
與 filter()
兩個 function 加以組合。
11 行
const getBooks = compose( filter, whereEq(item) )();
與一般 compose()
不同的是:最後還加上了 ()
,因為 whereEq(item)
不需要任何參數,所以直接以 ()
結束。
whereEq(item)
產生的 predicate 傳給 filter()
後,還留一個參數,這正是要傳給 getBooks()
的 data,因為 Point-free 而省略。
Conclusion
- 當 predicate 有多個條件,可使用
where()
- 當 predicate 有多個條件,且資料來自於 object,並且只要判斷
===
而已,則可使用whereEq()
- 實務上不見的要使用
compose()
重構,filter(whereEq(item))
的寫法可讀性已經很高
Reference
以上所述就是小编给大家介绍的《Ramda 之 whereEq()》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learning Vue.js 2
Olga Filipova / Packt Publishing / 2017-1-5 / USD 41.99
About This Book Learn how to propagate DOM changes across the website without writing extensive jQuery callbacks code.Learn how to achieve reactivity and easily compose views with Vue.js and unders......一起来看看 《Learning Vue.js 2》 这本书的介绍吧!