實務上資料常以 Object Array 儲存,可透過 Ramda 將其轉成 CSV。
Version
Ramda 0.27.1
Array to CSV
import { pipe, map, join, values, head, keys, concat, __, converge } from 'ramda'
let data = [
{ title: 'FP in JavaScript', price: 100 },
{ title: 'Programming Haskell', price: 200 },
{ title: 'Speaking JavaScript', price: 300 }
]
let header = pipe(
head,
keys,
join(','),
concat(__, '\n')
)
let objToStr = pipe(
values,
join(',')
)
let body = pipe(
map(objToStr),
join('\n')
)
converge(
concat, [header, body]
)(data) // ?
第 3 行
let data = [
{ title: 'FP in JavaScript', price: 100 },
{ title: 'Programming Haskell', price: 200 },
{ title: 'Speaking JavaScript', price: 300 }
]
資料為 Object Array,我們希望轉成 CSV。
第 9 行
let header = pipe(
head,
keys,
join(','),
concat(__, '\n')
)
首先處理 CSV 的 header 部分:
head()
:取得 Array 第一筆資料處理 header,為 Objectkeys()
:將 Object 的 key 取出回傳 Arrayjoin(',')
:將 Array 轉成 String,並以,
分隔concat(__, '\n')
:在 String 結尾加上換行符號
21 行
let body = pipe(
map(objToStr),
join('\n')
)
處理 CSV 的 body 部分:
map(objToStr)
:將每筆資料 Object 轉成 Stringjoin('\n')
:將 Array 轉成 String,並以\n
分隔
16 行
let objToStr = pipe(
values,
join(',')
)
將 Object 轉成以 ,
分隔的 String,這也是最關鍵部分:
values()
:將 Object 的 value 取出回傳 Arrayjoin(',')
:將 Array 轉成 String,並以,
分隔
26 行
converge(
concat, [header, body]
)(data) // ?
將 header 與 body 整合成完整 CSV:
concat()
:將header
與body
合併converge()
:整合concat()
、header()
與body()
Conclusion
- Object Array 轉成 CSV 本質上就是一連串的轉換過程,特別適合使用 Ramda 實現