點燈坊

學而時習之,不亦悅乎

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

Sam Xiao's Avatar 2019-05-17

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

Version

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

console.log(union(first, second));

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

union000

union()

import { union } from 'ramda';

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

console.log(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

See Also

使用 concat() 合併 Array

Reference

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