點燈坊

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

使用 concatAll() 將 N 個 Array 合併成單一 Array

Sam Xiao's Avatar 2019-10-11

concat() 能將兩個 Array 合併成單一 Array,若是 N 個 Array 呢 ? Ramda 沒有提供此 Function,但我們能自行組合出 concatAll()

Version

macOS Catalina 10.15
VS Code 1.39.1
Quokka 1.0.254
Ramda 0.26.1
Wink-fp 0.1.8

concat()

import { concat } from 'ramda';

let first = [1, 2, 3];
let second = [4, 5, 6];

concat(first, second); // ?

Ramda 提供了 concat(),能將兩個 array 合併成單一 array。

concatall002

concatAll

import { reduce, unapply, concat } from 'ramda';

let first = [1, 2, 3];
let second = [4, 5, 6];
let third = [7, 8, 9];

let concatAll = unapply(reduce(concat, []));

concatAll(first, second); // ?
concatAll(first, second, third); // ?

concat() 這類 binary function,只能組合兩個 array,但透過 reduce(),只要提供初始值 [],就能組合出 n 個 array。

但因為 reduce() 只能接受 array,特別使用 unapply() 組合成 variadic function,如此可接受 n 個 argument。

concatall000

Wink-fp

import { concatAll } from 'wink-fp';

let first = [1, 2, 3];
let second = [4, 5, 6];
let third = [7, 8, 9];

concatAll(first, second); // ?
concatAll(first, second, third); // ?

Wink-fp 已經提供 concatAll(),可直接使用。

concatAll()
[a]... -> [b]
將無限個數 array 合併成單一 array

concatall001

Conclusion

  • unapply()reduce() 的組合可視為實現 variadic function 的 pattern

Reference

Ramda, concat()
Ramda, reduce()
Ramda, unapply()