點燈坊

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

使用 toPairs() 將 Object 轉成 Pair Array

Sam Xiao's Avatar 2020-11-26

實務上為了精簡,API 有時會將一對資料以 Object 形式傳遞,但處理上 Array 還是比 Object 方便,Ramda 提供了 toPairs() 將 Object 轉成 Pair Array。

Version

Ramda 0.27.1

Imperative

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

let toPairs = o => {
  let result = [];

  for (let k in o)
    result.push([k, o[k]])

  return result
}

toPairs(data) // ?

data 為 Object,其中 key 為 title,而 value 為 price,欲將 titlevalue 合併為 Pair 成為 Pair Array。

Imperative 會使用 for in loop 跑遍所有 property,並以 o[k] 取得 value,最後以 [k, o[k]] 重新組成 Pair。

topairs000

Object.entries()

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

Object.entries(data) // ?

ECMAScript 的 Object.entries() 亦可將 Object 轉成 Pair Array。

topairs003

converge()

import { converge, zip, keys, values } from 'ramda'

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

let toPairs = converge(
  zip, [keys, values]
)

toPairs(data) // ?

若以 FP 角度思考:

  • 使用 keys() 取得所有 key 所構成 Array
  • 使用 values() 取得所有 value 所構成 Array
  • 使用 zip() 將兩 Array 合併成 Pair Array

最後以 converge() 組合所有 function。

topairs001

lift()

import { lift, zip, keys, values } from 'ramda'

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

let toPairs = lift(zip)(keys, values)

toPairs(data) // ?

converge() 都可以 lift() 取代。

topairs004

Ramda

import { toPairs } from 'ramda'

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

toPairs(data) // ?

事實上 Ramda 已經提供 toPairs() 可直接使用。

toPairs()
{k, v} => [[k, v]]
將 Object 轉成 Pair Array

{k, v}:data 為 Object

[[k, v]]:將每個 key / value 轉成 Pair,以 Pair Array 回傳

topairs02

Conclusion

  • toPairs() 相當於 ECMAScript 的 Object.entries()
  • 若不知道 toPairs() 也沒關係,也可使用 keys()values()zip() 加以組合
  • toPairs() 讓我們將 Object 轉成 Array,可充分利用 Array 豐富的 function 做後續處理

Reference

Ramda, toPairs()
Ramda, keys()
Ramda, values()
Ramda, zip()
Ramda, converge()
MDN, Object.entries()