點燈坊

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

使用 reduceBy() 將 Array 分組並加總

Sam Xiao's Avatar 2020-04-03

若除了要有 reduce() 的 Loop 效果,又想邊 Loop 邊分組,Ramda 提供了 reduceBy()

Version

macOS Catalina 10.15.4
VS Code 1.43.2
Quokka 1.0.285
Ramda 0.27.0

Ramda

import { reduceBy } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 },
]

let f = reduceBy(
  (a, x) => [...a, x], [], 
  ({ price }) => 
    price < 110 ? 'A' : 
    price < 210 ? 'B' : 'C'
)

f(data) // ?

reduceBy() 的前兩個 argument 與 reduce() 相同,唯第三個 argument 為 string-returning function 提供分組的標準。

reduceBy()
((a, b) → a) → a → (b → String) → [b] → {String: a}

將 array 邊 loop 邊分組

(a, b) -> a:reducer function,運算 accumulator 與 value 關係

a:accumulator,每個 iteration 的累計值

b -> String:string-returning function,提供分組的標準

[b]:data 為 array

{String: a}:回傳分組後的 object

reduceby000

groupBy()

import { reduceBy } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 },
]

let groupBy = reduceBy((a, x) => [...a, x], [])

let f = groupBy(({ price }) => 
  price < 110 ? 'A' : 
  price < 210 ? 'B' : 'C'
)

f(data) // ?

reduceBy() 最簡單的應用就是 array 只是自然的累積,但 string-returning function 有自己的分組條件,如此就造就了 groupBy()

reduceby001

Conclusion

  • reduceBy() 為實務上較罕用 function,Ramda 的 groupBy() 底層也是使用 reduceBy() 實現

Reference

Ramda, reduceBy()