點燈坊

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

使用 difference() 對兩個 Array 相減

Sam Xiao's Avatar 2020-08-19

若要對兩個 Array 相減,可使用 difference() 處理, 尤其對 Object 比較的是 Value 而不是 Reference。

Version

Ramda 0.27.1

Primitive

import { pipe, difference } from 'ramda'

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

pipe(
  difference(a)
)(b) // ?

若想對兩個 Array 相減 a - b,Ramda 提供了 difference()

difference()
[*] → [*] → [*]
對兩個 array 相減

[*]:第一個 array

[*]:第二個 array

[*]:回傳相減結果

diff000

Object

import { pipe, difference } from 'ramda'

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

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

pipe(
  difference(a)
)(b) // ?

difference() 依然適用於 Object Array。

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

diff001

Conclusion

  • difference() 可輕易對兩 Array 相減,尤其對於 Object 是比較其 value equality,而不是 reference equality,非常實用

Reference

Ramda, difference()