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 包含 JavaScriptyear 大於 2017 的 data

第 9 行

const getBooks = filter(x => x.title.includes('JavaScript') && x.year >= 2017);

使用了 Ramda 的 filter() 並搭配 predicate function,由於包含了兩個條件,因此必須使用 && 才能串起來。

Ramda 之 where()

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 為 titleincludes() 則改用 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() 產生。

Ramda 之 where()

Conclusion

  • where() 特別適合用來產生 predicate function 給 filter()find() 之類的 operator 使用

Reference

Ramda , where()

Ramda , filter()

Ramda , includes()

Ramda , gte()

Ramda , __()


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

亚马逊跨境电商运营宝典

亚马逊跨境电商运营宝典

老魏 / 电子工业出版社 / 2018-6 / 69

《亚马逊跨境电商运营宝典》详细讲解亚马逊的平台知识和运营技巧,内容围绕亚马逊卖家的日常工作,系统讲解亚马逊账号注册、后台操作、选品、产品发布、Listing 优化、站内广告、FBA 发货、VAT 税务等内容,并且通过大量的案例分析,用生动翔实的案例为读者传递运营中必备的操作技巧和运营方法。 《亚马逊跨境电商运营宝典》内容针对性强,讲解的知识、技巧和方法都充分考虑到易学、易懂、易操作、易落地执......一起来看看 《亚马逊跨境电商运营宝典》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具