Ramda 之 propEq() 與 eqProps()

栏目: 编程语言 · 发布时间: 5年前

内容简介:Ramda 有兩個 Operator 長的非常像:VS Code 1.31.1Quokka 1.0.136

Ramda 有兩個 Operator 長的非常像: propEq()eqProps() ,初學者常常搞混,特別就這兩個 Operator 討論之。

Version

VS Code 1.31.1

Quokka 1.0.136

Ramda 0.26.1

propEq()

propEq()

String -> a -> Object -> Boolean

比對 object 的 property 與 value 是否相等

String :object 的 property

a :要比較的資料

Object :data 為 object

Boolean :若相等傳回 true ,不相等傳回 false

由於 propEq() 的 currying 特性,只提供前兩個參數,剛好回傳 Object -> Boolean ,特別適合成為 predicate function

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 getTitle = val => filter(x => x.title === val)

const result = getTitle('RxJS in Action')(data)
console.dir(result)

第 9 行

const getTitle = val => filter(x => x.title === val)

想使用 filter() 找到指定 title 的 object,第一個參數為 predicate function,因此可使用 Arrow Function 表示。

Ramda 之 propEq() 與 eqProps()

import { filter, prop, equals, 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 getTitle = val => filter(
  compose(
    equals(val), 
    prop('title')
  )
)

const result = getTitle('RxJS in Action')(data)
console.dir(result)

由於 x.title 可使用 Ramda 的 prop() ,而 === 可使用 Ramda 的 equals() ,因此可用 compose() 動態組合出一個新 function 產生 predicate function。

Ramda 之 propEq() 與 eqProps()

import { propEq, 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 getTitle = title => filter(
  propEq('title', title),
)

const result = getTitle('RxJS in Action')(data)
console.dir(result)

由於 compose(equals(val), prop('title')) 這類 function 實在太常使用,因此 Ramda 提供了 propEq()

Ramda 之 propEq() 與 eqProps()

eqProps()

eqProps()

k → {k: v} → {k: v} → Boolean

根據指定的 property 比較兩個 object 是否相等

k :指定要比較 property 的 key

{k: v} :要比較的 source object

{k: v} :data 為要比較的 target object

Boolean :若相等傳回 true ,不相等傳回 false

由於 eqProps() 的 currying 特性,只提供前兩個參數,剛好回傳 {k: v} -> Boolean ,特別適合成為 predicate function

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' }

const getTitle = item => filter(x => x.title === item.title)

const result = getTitle(item)(data)
console.dir(result)

11 行

const getTitle = item => filter(x => x.title === item.title)

想使用 filter() 找到指定 title 的 object,第一個參數為 predicate function,因此可使用 Arrow Function 表示。

由於 item 為 object,因此必須使用 item.title 才能抓到值。

Ramda 之 propEq() 與 eqProps()

import { filter, prop, compose, equals } 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' }

const getTitle = item => filter(
  compose(
    equals(prop('title', item)),
    prop('title')
  )
)

const result = getTitle(item)(data)
console.dir(result)

由於 x.title 可使用 Ramda 的 prop() ,而 === 可使用 Ramda 的 equals() ,因此可用 compose() 動態組合出一個新 function 產生 predicate function。

由於 item 為 object,不能直接給 eqauls() 使用,必須先透過 prop() 取得 item.title

import { filter, eqProps } 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' }

const getTitle = item => filter(
  eqProps('title')(item)
)

const result = getTitle(item)(data)
console.dir(result)

由於 compose(equals(prop('title', item)), prop('title')) 這類 function 實在太常使用,因此 Ramda 提供了 eqProps()

Q : 為什麼稱為 eqProps() 呢 ?

因為 item 為 object,使得 equals() 一定先得透過 prop() 取得值,所以稱為 eqProps()

Ramda 之 propEq() 與 eqProps()

Conclusion

  • propEq() 是 object 的 property 是否等於指定 value;而 eqProps() 是兩個 object 的指定 property 是否相等
  • 當參數為 value 時,會使用 propEq() ;當參數為 object 時,會使用 eqProps()

Reference

Ramda , propEq()

Ramda , eqProps()

Ramda , compose()

Ramda , prop()

Ramda , equals()


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

查看所有标签

猜你喜欢:

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

JavaScript编程精解

JavaScript编程精解

Marijn Haverbeke / 徐涛 / 机械工业出版社华章公司 / 2012-10-1 / 49.00元

如果你只想阅读一本关于JavaScript的图书,那么本书应该是你的首选。本书由世界级JavaScript程序员撰写,JavaScript之父和多位JavaScript专家鼎力推荐。本书适合作为系统学习JavaScript的参考书,它在写作思路上几乎与现有的所有同类书都不同,打破常规,将编程原理与运用规则完美地结合在一起,而且将所有知识点与一个又一个经典的编程故事融合在一起,读者可以在轻松的游戏式......一起来看看 《JavaScript编程精解》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码