zip()
只能制式的將兩個 Array 合併成 Array Pair,若想將兩個 Array 合併成其他形式則要使用 zipWith()
。
Version
Ramda 0.27.1
zip()
import { zip } from 'ramda'
let girls = [
{ name: 'Mary' },
{ name: 'Jessie' }
]
let boys = [
{ name: 'John', car: 'BMW' },
{ name: 'Tomy', car: 'TOYOTA' },
{ name: 'Paul', car: 'Benz' }
]
let f = zip
f (girls) (boys) // ?
想將 girls
與 boys
兩個 Array 合併,直覺會使用 zip()
。
但 zip()
只能合併成制式的 Array Pair。
zipWith()
import { zipWith } from 'ramda'
let girls = [
{ name: 'Mary' },
{ name: 'Jessie' }
]
let boys = [
{ name: 'John', car: 'BMW' },
{ name: 'Tomy', car: 'TOYOTA' },
{ name: 'Paul', car: 'Benz' }
]
let f = zipWith ((x, y) => `${x.name}: ${y.car}`)
f (girls) (boys) // ?
若想合併成 Array String,且格式為 name: car
,其中 name
來自於 girls
,而 car
來自於 boys
。
對於自訂形式合併,可使用 zipWith()
提供自訂 function。
zipWith()
((a, b) → c) → [a] → [b] → [c]
自行提供 function 的zip()
((a, b) → c)
:傳入 function 描述合併方式
[a]
:data 為 Array
[b]
:data 為 Array
[c]
:回傳合併後新 Array
zip()
相當於zipWith((x, y) => [x, y])
Point-free
import { zipWith, useWith, prop } from 'ramda'
import { formatN } from 'wink-fp'
let girls = [
{ name: 'Mary' },
{ name: 'Jessie' }
]
let boys = [
{ name: 'John', car: 'BMW' },
{ name: 'Tomy', car: 'TOYOTA' },
{ name: 'Paul', car: 'Benz' }
]
let toString = useWith(
formatN (2) ('{0}: {1}'), [prop ('name'), prop ('car')]
)
let f = zipWith (toString)
f (girls) (boys) // ?
若想進一步將傳入 zipWith()
的 function 也 Point-free,可使用 useWith()
加以組合:
formatN (2) ('{0}: {1}')
:建立 template stringprop ('name')
:從girls
取出name
propertyprop ('car')
:從boys
取出car
property
Conclusion
zipWith()
能自行提供 function,彈性比zip()
大很多