點燈坊

失くすものさえない今が強くなるチャンスよ

使用 symmetricDifference() 找出沒同時存在兩 Array 的 Element

Sam Xiao's Avatar 2019-09-28

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 沒有 同時存在於 firstsecond array,若不知道 Ramda 提供了 symmetricDifference(),其實也可以由 difference() 組合出來:

  1. 先使用 difference() 找出 first 不在 second 的 element
  2. 再使用 difference() 找出 second 不在 first 的 element
  3. 將兩個 array concat() 起來

symmetricdifference000

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

symmetricdifference001

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); // ?

firstsecond 的 element 為 object,想得知不同時存在於兩個 array 的 object 有哪些,symmetricDifference() 依然適用。

ECMAScript 的 ===,對於 object 是 reference equality,但以處理 data 角度而言,這並沒有實質用處,而 symmetricDifference() 比較的是 value equality,也就是 property 相等,就視為兩個 object 相等,這在實務上非常有用

symmetricdifference002

Conclusion

  • symmetricDifference() 可輕易找出不同時存在於兩個 array 的部分,尤其對於 object 是比較其 value equality,而不是 reference equality,非常實用

Reference

Ramda, symmetricDifference()