若要將兩個 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()
組合出來。
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]
:回傳相減結果
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 相等,這在實務上非常有用
Conclusion
- Ramda 並沒有如同
differenceWith()
提供withoutWith()
,但也可組合flip()
與differenceWith()
成為withoutWith()
without()
可輕易對兩 Array 相減,尤其對於 Object 是比較其 value equality,而不是 reference equality,非常實用