點燈坊

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

如何將 Object Array 轉 CSV ?

Sam Xiao's Avatar 2021-01-30

實務上資料常以 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,為 Object
  • keys():將 Object 的 key 取出回傳 Array
  • join(','):將 Array 轉成 String,並以 , 分隔
  • concat(__, '\n'):在 String 結尾加上換行符號

21 行

let body = pipe(
  map(objToStr),
  join('\n')
)

處理 CSV 的 body 部分:

  • map(objToStr):將每筆資料 Object 轉成 String
  • join('\n'):將 Array 轉成 String,並以 \n 分隔

16 行

let objToStr = pipe(
  values,
  join(',')
)

將 Object 轉成以 , 分隔的 String,這也是最關鍵部分:

  • values():將 Object 的 value 取出回傳 Array
  • join(','):將 Array 轉成 String,並以 , 分隔

26 行

converge(
  concat, [header, body]
)(data) // ?

將 header 與 body 整合成完整 CSV:

  • concat():將 headerbody 合併
  • converge():整合 concat()header()body()

csv000

Conclusion

  • Object Array 轉成 CSV 本質上就是一連串的轉換過程,特別適合使用 Ramda 實現