sysmmetricDifference()
是較少用的 Function,跟 difference()
有點類似,但又不太一樣。
Version
macOS Mojave 10.14.6
VS Code 1.38.1
Quokka 1.0.253
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)
);
symmetricDifference(first)(second); // ?
想知道哪些 element 沒有
同時存在於 first
與 second
array,若不知道 Ramda 提供了 symmetricDifference()
,其實也可以由 difference()
組合出來:
- 先使用
difference()
找出first
不在second
的 element - 再使用
difference()
找出second
不在first
的 element - 將兩個 array
concat()
起來
Ramda
Value
import { symmetricDifference } from 'ramda';
let first = [1, 3, 5, 7];
let second = [1, 4, 7];
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'},
];
symmetricDifference(first, second); // ?
若 first
與 second
的 element 為 object,想得知不同時存在於兩個 array 的 object 有哪些,symmetricDifference()
依然適用。
ECMAScript 的
===
,對於 object 是 reference equality,但以處理 data 角度而言,這並沒有實質用處,而symmetricDifference()
比較的是 value equality,也就是 property 相等,就視為兩個 object 相等,這在實務上非常有用
Conclusion
symmetricDifference()
可輕易找出不同時存在於兩個 array 的部分,尤其對於 object 是比較其 value equality,而不是 reference equality,非常實用