Ramda 之 unionWith()
栏目: JavaScript · 发布时间: 5年前
内容简介:若想將兩個 Array 加以合併,並只保留不重複部分,Ramda 提供了VS Code 1.33.1Quokka 1.0.209
若想將兩個 Array 加以合併,並只保留不重複部分,Ramda 提供了 union()
,但若要自訂比較條件,則要使用 unionWith()
。
Version
VS Code 1.33.1
Quokka 1.0.209
Ramda 0.26.1
Functional
import { uniqWith, concat } from 'ramda'; let first = [1, 3, 5]; let second = [5, 3, 7]; // unionWith :: ((a, a) → Boolean) → [*] → [*] → [*] let unionWith = pred => arr1 => arr2 => uniqWith(pred, concat(arr1, arr2)); // fn :: [*] -> [*] -> [*] let fn = unionWith((x, y) => x === y); console.log(fn(first)(second));
union()
可透過 concat()
與 uniq()
組合;同理, unionWith()
也可透過 concat()
與 uniqWith()
組合而成。
unionWith()
import { unionWith } from 'ramda'; let first = [1, 3, 5]; let second = [5, 3, 7]; // fn :: [*] -> [*] -> [*] let fn = unionWith((x, y) => x === y); console.log(fn(first)(second));
事實上 Ramda 已經提供 unionWith()
,可直接使用。
unionWith()
((a, a) → Boolean) → [*] → [*] → [*]
自行提供 predicate 決定比較方式,將兩個 array 合併成不重複 array
(a, a) -> Boolean
:
[*]
:第一個 array
[*]
:第二個 array
[*]
:回傳第一個 array 不存在於第二個 array 部分
Object
import { unionWith } from 'ramda'; let first = [ { firstName: 'Sam', lastName: 'Xiao'}, { firstName: 'Kevin', lastName: 'Yang'}, { firstName: 'Jimmy', lastName: 'Huang'}, ]; let second = [ { firstName: 'Kevin', lastName: 'Yang'}, ]; // fn :: [*] -> [*] -> [*] let fn = unionWith((x, y) => x.firstName === y.firstName && x.lastName === y.lastName); console.dir(fn(first)(second));
unionWith()
也可以用在 object。
由於 unionWith()
是使用 uniqWith()
實現,而 uniqWith()
是使用 equals()
比較,而非 ECMAScript 的 ===
,因此比較的是 value equality,而非 reference equality
Point-free
import { unionWith, allPass, eqProps } from 'ramda'; let first = [ { firstName: 'Sam', lastName: 'Xiao'}, { firstName: 'Kevin', lastName: 'Yang'}, { firstName: 'Jimmy', lastName: 'Huang'}, ]; let second = [ { firstName: 'Kevin', lastName: 'Yang'}, ]; // fn :: [*] -> [*] -> [*] let fn = unionWith(allPass([ eqProps('firstName'), eqProps('lastName') ])); console.dir(fn(first)(second));
若 predicate 有多個條件,就很適合使用 allPass()
使其 point-free,且每個條件又可使用 eqProps()
,也是 point-free。
Conclusion
- 只要牽涉到比較,Ramda 都是使用自家的
equals()
,而非 ECMAScript 的===
,因此是 value equality,而非 reference equality
Reference
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
做自己:鬼脚七自媒体第一季
鬼脚七 / 电子工业出版社 / 2013-7 / 77.00元
当我们习惯了在社会上带着面具的时候,真实成为了一件奢侈的事情。 做到足够真实,让自己的本性表达出来,这需要勇敢。本书是鬼脚七自媒体的原创文集,主题就是做自己。本书有关于生活、互联网、自媒体的睿智分享,也有关于淘宝、搜索的独到见解,是一本接地气,文艺范,并充满正能量的电商生活书。 本书最适合淘宝卖家、电子商务人群、希望了解电商和互联网的人群阅读,也推荐热爱生活的70、80、90后阅读。一起来看看 《做自己:鬼脚七自媒体第一季》 这本书的介绍吧!