點燈坊

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

使用 union() 合併兩 Array 並且不重複

Sam Xiao's Avatar 2019-07-06

若想將兩個 Array 加以合併,並只保留不重複部分,Ramda 提供了 union()

Version

macOS Mojave 10.14.5
VS Code 1.4
Quokka 1.0.209
Ramda 0.26.1

Functional

import { pipe, concat, uniq } from 'ramda';

let first = [1, 3, 5];
let second = [5, 3, 7];

// union :: [*] → [*] → [*]
let union = pipe(concat, uniq);

union(first, second); // ?

根據 union() 原始意義:將兩個 Array 加以合併,只保留不重複部分,其實我們也可以使用 concat()uniq() 組合而成。

union000

Ramda

import { union } from 'ramda';

let first = [1, 3, 5];
let second = [5, 3, 7];

union(first)(second); // ?

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

uniq()
[*] → [*] → [*]
將兩個 array 合併成不重複 array

[*]:第一個 array

[*]:第二個 array

[*]:回傳合併後不重複 array

union001

Object

import { union } from 'ramda';

let first = [
  { firstName: 'Sam',   lastName: 'Xiao'},
  { firstName: 'Kevin', lastName: 'Yang'},
  { firstName: 'Jimmy', lastName: 'Huang'},
];

let second = [
  { firstName: 'Kevin', lastName: 'Yang'},
];

console.dir(union(first)(second));

union() 也可以用在 object。

由於 union() 使用 uniq() 實現,而 uniq() 又使用 equals() 比較,而非 ECMAScript 的 ===,因此比較的是 value equality,而非 reference equality

union002

Conclusion

  • 只要牽涉到比較,Ramda 都是使用自家的 equals(),而非 ECMAScript 的 ===,因此是 value equality,而非 reference equality

Reference

Ramda, union()
Ramda, pipe()
Ramda, concat()
Ramda, uniq()