Ramda 之 unionWith()
栏目: JavaScript · 发布时间: 6年前
内容简介:若想將兩個 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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据结构与算法分析
维斯 / 人民邮电 / 2006-10 / 59.00元
《数据结构与算法分析:C++描述》秉承Weiss著全一贯的严谨风格,同时又突出了实践。书中充分应用了现代C++语言特性,透彻地讲述了数据结构的原理和应用,不仅使学生具备算法分析能力,能够开发高效的程序,而且让学生掌握良好的程序设计技巧。一起来看看 《数据结构与算法分析》 这本书的介绍吧!