實務上為了精簡,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
,欲將 title
與 value
合併為 Pair 成為 Pair Array。
Imperative 會使用 for in
loop 跑遍所有 property,並以 o[k]
取得 value,最後以 [k, o[k]]
重新組成 Pair。
Object.entries()
let data = {
'FP in JavaScript': 100,
'RxJS in Action': 200,
'Speaking JavaScript': 300
}
Object.entries(data) // ?
ECMAScript 的 Object.entries()
亦可將 Object 轉成 Pair Array。
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。
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()
取代。
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 回傳
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()