點燈坊

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

如何實現分組加總 ?

Sam Xiao's Avatar 2019-08-27

分組加總 也是實務上常見的需求,該如何使用 Ramda 實現呢 ?

Version

macOS Mojave 10.14.6
VS Code 1.37.1
Quokka 1.0.240
Ramda 0.26.1

Group Sum

import { splitEvery, map, pipe, sum, pluck } from 'ramda';

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 },
  { title: 'JavaScript: The Good Parts', price: 400 },
  { title: 'Secrets of the JavaScript Ninja', price: 500 },
  { title: 'Impatient JavaScript', price: 600 },
  { title: 'You Dont Know JavaScript', price: 700 },
  { title: 'Effective JavaScript', price: 900 }
];

let fn = pr => cnt => pipe(
  pluck(pr),
  splitEvery(cnt),
  map(sum)
);

fn('price')(3)(data); // ?

data 每 3 筆 group 起來,並將 price 欄位加總。

思路:

  • 使用 pluck() 先把 price 欄位抓出來
  • 使用 splitEvery() 將 每 3 筆 group 起來
  • 使用 map(sum) 將各陣列加總起來就是答案

groupsum000

Conclusion

  • FP 思維就是將問題最小化、各個擊破、且戰且走,一個看似複雜的問題,將過程以 pluck()splitEvery()map()sum() pipeline 之後,就可以順利解決了

Reference

Ramda, pluck()
Ramda, splitEvery()
Ramda, map()
Ramda, sum()