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()


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

查看所有标签

猜你喜欢:

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

第三次工业革命

第三次工业革命

[美] 杰里米•里夫金(Jeremy Rifkin) / 张体伟 / 中信出版社 / 2012-5 / 45.00元

第一次工业革命使19世纪的世界发生了翻天覆地的变化 第二次工业革命为20世纪的人们开创了新世界 第三次工业革命同样也将在21世纪从根本上改变人们的生活和工作 在这本书中,作者为我们描绘了一个宏伟的蓝图:数亿计的人们将在自己家里、办公室里、工厂里生产出自己的绿色能源,并在“能源互联网”上与大家分享,这就好像现在我们在网上发布、分享消息一样。能源民主化将从根本上重塑人际关系,它将影响......一起来看看 《第三次工业革命》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具