Ramda 之 symmetricDifference() Series
栏目: JavaScript · 发布时间: 5年前
内容简介:VS Code 1.33.1Quokka 1.0.209
sysmmetricDifference()
是較少用的 Function,跟 difference()
有點類似,但又不太一樣。
Version
VS Code 1.33.1
Quokka 1.0.209
Ramda 0.26.1
Functional
import { concat, difference } from 'ramda'; let first = [1, 3, 5, 7]; let second = [1, 4, 7]; let symmetricDifference = (arr1, arr2) => concat( difference(arr1, arr2), difference(arr2, arr1) ); console.log(symmetricDifference(first, second));
想知道哪些 element 沒有同時存在於 first
與 second
array,若不知道 Ramda 提供了 symmetricDifference()
,其實也可以由 difference()
組合出來:
- 先使用
difference()
找出first
不在second
的 element - 再使用
difference()
找出second
不在first
的 element - 將兩個 array
concat()
起來
symmetricDifference()
Value
import { symmetricDifference } from 'ramda'; let first = [1, 3, 5, 7]; let second = [1, 4, 7]; console.log(symmetricDifference(first, second));
Ramda 提供了 symmetricDifference()
,其實也是由 difference()
與 concat()
組合出來的。
symmetricDifference()
[*] → [*] → [*]
回傳不同時存在於兩個 array 的 element
Object
import { symmetricDifference } from 'ramda'; let first = [ { firstName: 'Sam', lastName: 'Xiao'}, { firstName: 'Kevin', lastName: 'Yang'}, { firstName: 'Jimmy', lastName: 'Huang'}, ]; let second = [ { firstName: 'Kevin', lastName: 'Yang'}, { firstName: 'Jessie', lastName: 'Hsieh'}, ]; console.dir(symmetricDifference(first, second));
若 first
與 second
的 element 為 object,想得知不同時存在於兩個 array 的 object 有哪些, symmetricDifference()
依然適用。
ECMAScript 的 ===
,對於 object 是 reference equality,但以處理 data 角度而言,這並沒有實質用處,而 symmetricDifference()
比較的是 value equality,也就是 property 相等,就視為兩個 object 相等,這在實務上非常有用
symmetricDifferenceWith()
Value
Non Point-free
import { symmetricDifferenceWith } from 'ramda'; let first = [1, 3, 5, 7]; let second = [1, 4, 7]; console.log(symmetricDifferenceWith((x, y) => x === y, first, second));
symmetricDifference()
提供的是內定的比較方式,而 symmetricDifferenceWith()
可提供自訂的 predicate。
symmetricDifferenceWith()
((a, a) → Boolean) → [a] → [a] → [a]
回傳不同時存在於兩個 array 的 element,但可提供 predicate function 客製化
((a, a) → Boolean)
:決定判斷相等的 predicate function
[a]
:第一個 array
[a]
:第二個 array
[a]
:回傳不同時存在於兩個 array 的 element
Point-free
import { symmetricDifferenceWith, equals } from 'ramda'; let first = [1, 3, 5, 7]; let second = [7, 1, 4]; console.log(symmetricDifferenceWith(equals, first, second));
symmetricDiffernceWith()
的 predicate,也可以使用 equals()
使其 point-free。
Object
Non Point-free
import { symmetricDifferenceWith } from 'ramda'; let first = [ { firstName: 'Sam', lastName: 'Xiao'}, { firstName: 'Kevin', lastName: 'Yang'}, { firstName: 'Jimmy', lastName: 'Huang'}, ]; let second = [ { firstName: 'Kevin', lastName: 'Yang'}, { firstName: 'Jessie', lastName: 'Hsieh'}, ]; let predicate = (x, y) => x.firstName === y.firstName && x.lastName === y.lastName; console.dir(symmetricDifferenceWith(predicate, first, second));
symmetricDifference()
也可以搭配 symmetricDifferenceWith()
使用自己的 predicate,此例完全與 symmetricDifference()
相同。
symmetricDifferenceWith()
可貴之處在於自訂 predicate,如只比較 lastName
即可,不用比較 firstName
,若沒有特別之處,使用 symmetricDifference()
即可
Point-free
import { symmetricDifferenceWith, allPass, eqProps } from 'ramda'; let first = [ { firstName: 'Sam', lastName: 'Xiao'}, { firstName: 'Kevin', lastName: 'Yang'}, { firstName: 'Jimmy', lastName: 'Huang'}, ]; let second = [ { firstName: 'Kevin', lastName: 'Yang'}, { firstName: 'Jessie', lastName: 'Hsieh'}, ]; let predicate = allPass([ eqProps('firstName'), eqProps('lastName') ]); console.dir(symmetricDifferenceWith(predicate, first, second));
若 predicate 有多個條件,就很適合使用 allPass()
使其 point-free,且每個條件又可使用 eqProps()
,也是 point-free。
allPass()
與 eqProps()
組合就是典型 point-free 使程式碼可讀性更高的典範
Conclusion
-
symmetricDifference()
與symmetricDifferenceWith()
可輕易找出不同時存在於兩個 array 的部分,尤其對於 object 是比較其 value equality,而不是 reference equality,非常實用 -
symmetricDifferenceWith()
對於 object,可使用allPass()
與eqProps()
使其 point-free,非常經典
Reference
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。