點燈坊

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

如何計算 Array 平均值 ?

Sam Xiao's Avatar 2020-11-21

計算 Array 的平均值為常見需求,但 Ramda 並沒有內建 avg(),但可自行組合。

Version

Ramda 0.27.1

converge()

import { converge, divide, sum, length } from 'ramda'

let data = [1, 2, 3]

let avg = converge(
  divide, [sum, length]
)

avg(data) // ?
  • 使用 sum() 計算 Array 總和
  • 使用 length() 計算 Array 的 element 個數
  • 使用 converge() 分別將 sum()length() 結果傳給 divide() 計算平均

avg001

lift()

import { lift, divide, sum, length } from 'ramda'

let data = [1, 2, 3]

let avg = lift(divide)(sum, length)

avg(data) // ?
  • 使用 lift()divide() 改變 signature
  • converge() 須以 Array 傳入 function,lift() 則以 variadic function 傳入 function

avg002

juxt()

import { pipe, juxt, apply, divide, sum, length } from 'ramda'

let data = [1, 2, 3]

let avg = pipe(
  juxt([sum, length]),
  apply(divide)
)

avg(data) // ?
  • 使用 juxt() 將 Array 先將過 sum()length() 處理
  • 因為 juxt() 回傳為 Array,所以使用 apply()divide() 改變能接受 Array

avg003

Wink-fp

import { avg } from 'wink-fp'

let data = [1, 2, 3]

avg(data) // ?

Wink-fp 已經內建 avg() 可直接使用。

avg000

Conclusion

  • avg() 雖然是簡單應用,但可分別使用 converge()lift()juxt() 實現

Reference

stackoverflow, How to convert simple average function in javascript to pointfree form using Ramda ?