點燈坊

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

使用 without() 將兩個 Array 相減

Sam Xiao's Avatar 2020-08-19

若要將兩個 Array 相減,Ramda 可使用 difference()without(),兩者差異只有 Argument 順序不同。

Version

macOS Catalina 10.15.6
Ramda 0.27.0

Functional

import { flip, difference } from 'ramda'

let a = [1, 2]
let b = [1, 2, 3, 4]

let without = flip(difference)

without(a)(b) // ?

若想對兩個 array 相減 b - a,若不知道 Ramda 提供了 without(),其實也可以由 difference()flip() 組合出來。

without000

Primitive

import { without } from 'ramda'

let a = [1, 2]
let b = [1, 2, 3, 4]

without(a)(b) // ?

其實 Ramda 已經提供了 without() 可直接使用。

without()
[a] → [a] → [a]
對兩個 array 相減

[a]:傳入第一個 array

[a]:傳入第二個 array

[a]:回傳相減結果

without001

Object

import { without } from 'ramda'

let a = [{ name: 'Sam' }, { name: 'Kevin' }, { name: 'Jimmy' }]

let b = [{ name: 'Kevin' }]

without(b)(a) // ?

difference() 依然適用於 Object Array。

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

without002

Conclusion

  • Ramda 並沒有如同 differenceWith() 提供 withoutWith(),但也可組合 flip()differenceWith() 成為 withoutWith()
  • without() 可輕易對兩 Array 相減,尤其對於 Object 是比較其 value equality,而不是 reference equality,非常實用

Reference

Ramda, without()
Ramda, difference()
Ramda, flip()